【问题标题】:Can main() have an exception specification?main() 可以有异常规范吗?
【发布时间】:2017-10-08 17:11:52
【问题描述】:

在标准 C++ 中,main 函数可以有异常规范吗?

例如,以下是否合法?

int main() noexcept {}

【问题讨论】:

  • 这很愚蠢。如果从 main 中抛出异常,程序会以异常回溯退出。如果一个函数抛出了一些不在其异常规范中的东西,它也会做同样的事情。
  • @ZanLynx 实际上你的第一个案例调用std::terminate,你的第二个案例调用std::unexpected。默认情况下,后者调用前者,但可以更改。任何“异常回溯”都是特定于实现的扩展。

标签: c++ c++11 main exception-specification


【解决方案1】:

是的,这完全是合法的。 C++ 标准([basic.start.main][except.spec] 或其他地方)中没有禁止这样做的措辞。

即使在 C++17 及更高版本中,异常规范是函数类型的一部分,main 也仅根据[basic.start.main#2] 限制其链接和返回类型:

实现不应预定义main 函数。该功能不得重载。其类型应具有 C++ 语言链接,并且应具有声明的返回类型 int,否则其类型是实现定义的。

【讨论】:

  • 您可能想要引用 C++ 14 (N4140) [except.spec] 15.4/13(或其他版本的等效版本):“exception-specification 不被视为一部分函数的类型。”与 [basic.start.main] 3.6.1/2 一起:“...main ... 应声明返回类型为int,否则其类型是实现定义的。”
  • @Angew 但是由于 C++17 noexcept-specification 是函数类型的一部分。
猜你喜欢
  • 2017-06-24
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
相关资源
最近更新 更多