2017-05-10 79 views
1

在標準C++中,main函數是否有異常規範?main()是否有異常規範?

例如,是否合法?

int main() noexcept {} 
+0

雖然很愚蠢。如果一個異常被拋出主程序,程序將退出並返回異常。如果一個函數拋出一些不在其異常規範中的東西,它也會這樣做。 –

+2

@ZanLynx實際上你的第一個案例調用'std :: terminate',而你的第二個案例調用['std :: unexpected'](http://en.cppreference.com/w/cpp/error/unexpected)。默認情況下,後者調用前者,但可以更改。任何「異常回溯」都是特定於實現的擴展。 –

回答

4

是的,它完全是合法的。在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

相關問題