c++ - 函数声明后的 throw() 有什么用?

标签 c++

<分区>

Throw 在https://en.cppreference.com/w/cpp/language/throw 中定义为C++ 表达式 .从句法上讲,它后面跟着一个异常类名。例如:

int a = 1, b = 0; 
if (b==0){
    string m ="Divided by zero";
    throw MyException(m);       //MyException is a class that inherit std::exception class
}

但是,我看到了其他我不太理解的 throw 语法:

void MyFunction(int i) throw();     // how can we have an expression following a function definition? 

或者在自定义异常类中,我们还有:

class MyException : public std::exception
{
public:
  MyException( const std::string m)
    : m_( m )
  {}

  virtual ~MyException() throw(){};               // what is throw() in this case? 
  const char* what() const throw() {                       // what are the parentheses called? 
      cout<<"MyException in ";
      return m_.c_str(); 
  }

private:
  std::string m_;
};

因此,我的问题是:

  1. 是否存在允许表达式后跟函数定义的通用语法规则?
  2. 为什么表达式 throw 后要有括号?它们在 C++ 中叫什么?

最佳答案

throw() 不是 throw 表达式。它是一个完全独立的语法结构,只是恰好看起来相同(C++ 喜欢为多种目的重用关键字,而不是保留更多标识符)。 throw() 在您的示例中使用的位置不是语言语法期望表达式的位置,因此它不能是 throw 表达式。此外,() 也不是有效的表达式(在 throw 表达式中的 throw 之后需要)。

这是声明一个非抛出的语法dynamic exception specification对于一个函数,意味着它声明该函数不会抛出任何异常。

自 C++11 以来,该语法已被弃用,并最终从 C++20 的语言中完全删除。因此,不应再使用它。

动态异常规范的确切机制没有替代品,但特别是非抛出声明 throw() 已被 noexcept specifier 取代(C++11 起)。因此,旧代码中函数声明中所有使用 throw() 的地方都应该更新为 noexcept

关于c++ - 函数声明后的 throw() 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73551110/

相关文章:

c++ - 如何在添加后 30 秒内从链表中删除项目?

c++ - 帮助实现一个 "store buying"程序

c++ - 如何记录结构中的前 5 个值

c++ - Makefile 头目录错误

c++ - Qt外部库重复符号链接(symbolic link)错误

c++ - 大解空间的多线程搜索

c++ - qt c++ 中的多个文件阅读器

c++ - 编写多个 If 语句的优雅方式

c++ - 即使在使用 extern "C"之后,如何解决名称重整出现的问题?

c++ - 是否允许主线程在进入 main() 之前生成 POSIX 线程?