main()是否有异常规范?

问题描述:

在标准C++中,main函数是否有异常规范?main()是否有异常规范?

例如,是否合法?

int main() noexcept {} 
+0

虽然很愚蠢。如果一个异常被抛出主程序,程序将退出并返回异常。如果一个函数抛出一些不在其异常规范中的东西,它也会这样做。 –

+2

@ZanLynx实际上你的第一个案例调用'std :: terminate',而你的第二个案例调用['std :: unexpected'](http://en.cppreference.com/w/cpp/error/unexpected)。默认情况下,后者调用前者,但可以更改。任何“异常回溯”都是特定于实现的扩展。 –

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

即使在C++ 17和后面,其中例外规格功能类型的一部分,main只限于在其连接和返回类型根据[basic.start.main#2]

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

+0

您可能需要引用C++ 14(N4140)[except.spec] 15.4/13(或与其他版本相同):“一个*异常规范*不被视为函数类型的一部分。与[basic.start.main]一起使用3.6.1/2:“...'main' ...应具有 类型为”int“的声明返回类型,否则其类型为实现定义。 – Angew

+0

@Angew但是自C++ 17以来,noexcept-specification是函数类型的一部分。 – songyuanyao