2017-05-10 5 views
1

En C++ standard, la fonction main peut-elle avoir une spécification d'exception?Can main() peut-il avoir une spécification d'exception?

Par exemple, est-ce que ce qui suit est légal?

int main() noexcept {} 
+0

C'est ridicule cependant. Si une exception est levée, le programme se termine avec une exception backtrace. Si une fonction renvoie quelque chose qui n'est pas dans sa spécification d'exception, elle fait de même. –

+2

@ZanLynx En fait votre premier cas appelle 'std :: terminate', et votre deuxième cas appelle [' std :: unexpected'] (http://en.cppreference.com/w/cpp/error/unexpected). Par défaut, ce dernier appelle le premier, mais cela peut être changé. Toute "exception backtrace" serait une extension spécifique à l'implémentation. –

Répondre

4

Oui, c'est tout à fait légal. Il n'y a pas de libellé dans la norme C++ (dans [basic.start.main], [except.spec], ou ailleurs) qui l'interdit.

Même en C++ 17 et plus tard lorsque les spécifications d'exception font partie du type de fonction, main n'est limitée dans son lien et le type de retour selon [basic.start.main#2]:

Une mise en œuvre ne doit pas prédéfinir la fonction main . Cette fonction ne doit pas être surchargée. Son type doit avoir un lien de langage C++ et il doit avoir un type de retour déclaré de type int, mais sinon son type est défini par l'implémentation.

+0

Vous pourriez vouloir citer C++ 14 (N4140) [except.spec] 15.4/13 (ou l'équivalent des autres versions): "Une * spécification d'exception * n'est pas considérée comme faisant partie du type d'une fonction." avec [basic.start.main] 3.6.1/2: "...' main' ... doit avoir un type de retour déclaré de type 'int', mais sinon son type est défini par l'implémentation." – Angew

+0

@Angew Mais puisque C++ 17 noexcept-specification fait partie du type de fonction. – songyuanyao