回答
是的,它完全是合法的。在C++標準([basic.start.main],[except.spec]或其他地方)中沒有措辭禁止這一點。
即使在C++ 17和後面,其中例外規格功能類型的一部分,main
只限於在其連接和返回類型根據[basic.start.main#2]:
一種實現不應預定義的功能
main
。該功能不得超載。其類型應具有C++語言鏈接,並且應具有int
類型的聲明返回類型,否則其類型是實現定義的。
您可能需要引用C++ 14(N4140)[except.spec] 15.4/13(或與其他版本相同):「一個*異常規範*不被視爲函數類型的一部分。與[basic.start.main]一起使用3.6.1/2:「...'main' ...應具有 類型爲」int「的聲明返回類型,否則其類型爲實現定義。 – Angew
@Angew但是自C++ 17以來,noexcept-specification是函數類型的一部分。 – songyuanyao
- 1. GCC異常規範
- 2. 是否有bash的規範?
- 3. 異常規範和模板
- 4. 繞過Java異常規範...?
- 5. JUnit異常在main?
- 6. 是否有完整的Java規範
- 7. ShowCase視圖是否有Material Design規範?
- 8. 是否有'官方'CPAN規範文檔?
- 9. 是否有DE JURE電子書規範
- 10. 是否有mustache.js的規範叉?
- 11. PHP:是否有路徑規範約定?
- 12. 是否有Perl6規範形式?
- 13. 重載函數的C++異常規範
- 14. 主要方法的Java異常規範
- 15. 異常規範重寫虛函數
- 16. C++異常規範 - 處理無效異常
- 17. 異常線程 「main」 java.lang.ArrayIndexOutOfBoundsException:0
- 18. 線程「main」中的異常
- 19. 異常線程 「main」 java.lang.ArrayIndexOutOfBoundsException:-1
- 20. 異常線程 「main」 org.hibernate.HibernateException:
- 21. 異常線程 「main」 org.hibernate.MappingException
- 22. 致命異常:main java.lang.RuntimeException
- 23. 異常線程「main」 java.util.IllegalFormatConversionException
- 24. 異常線程「main」 java.lang.UnsatisfiedLinkError中」
- 25. 異常線程「main」 java.util.NoSuchElementException
- 26. 異常線程「main」 java.lang.ArrayIndexOutOfBoundsException:0
- 27. 異常線程「main」 java.lang.NoSuchMethodError
- 28. SLF4J:異常線程「main」 java.lang.NoSuchMethodError
- 29. 異常線程 「main」 org.springframework.beans.factory.UnsatisfiedDependencyException
- 30. 致命異常:main NullPointerException doIngBackground
雖然很愚蠢。如果一個異常被拋出主程序,程序將退出並返回異常。如果一個函數拋出一些不在其異常規範中的東西,它也會這樣做。 –
@ZanLynx實際上你的第一個案例調用'std :: terminate',而你的第二個案例調用['std :: unexpected'](http://en.cppreference.com/w/cpp/error/unexpected)。默認情況下,後者調用前者,但可以更改。任何「異常回溯」都是特定於實現的擴展。 –