2017-05-10 3 views
1

In Standard C++, kann die main Funktion eine Ausnahme-Spezifikation haben?Kann main() eine Ausnahmespezifikation haben?

Zum Beispiel, ist das Folgende legal?

int main() noexcept {} 
+0

Es ist aber albern. Wenn eine Exception außer Kraft gesetzt wird, wird das Programm mit einer Ausnahme backtrace beendet. Wenn eine Funktion etwas auslöst, das nicht in ihrer Ausnahmebestimmung ist, macht sie dasselbe. –

+2

@ZanLynx tatsächlich ruft Ihr erster Fall 'std :: terminate' auf, und Ihr zweiter Fall ruft [' std :: unexpected'] auf (http://en.cppreference.com/w/cpp/error/unexpected). Standardmäßig ruft Letzteres das erstere auf, aber das kann geändert werden. Jedes "Ausnahme-Backtrace" wäre eine implementierungsspezifische Erweiterung. –

Antwort

4

Ja, es ist völlig legal. Es gibt keine Formulierung im C++ - Standard (in [basic.start.main], [except.spec] oder anderswo), die dies verbietet.

Auch in C++ 17 und später, wo Ausnahme Spezifikationen Teil des Funktionstypen sind, main ist nur in seiner Verknüpfung beschränkt und Art Rückkehr nach [basic.start.main#2]:

Eine Implementierung muss die main Funktion nicht vordefinieren . Diese Funktion darf nicht überlastet werden. Sein Typ muss eine C++ - Sprachverknüpfung haben und er muss einen deklarierten Rückgabetyp vom Typ int haben, ansonsten ist sein Typ implementierungsdefiniert.

+0

Sie könnten C++ 14 (N4140) [except.spec] 15.4/13 (oder ein Äquivalent aus anderen Versionen) zitieren: "Eine * exception-specification * wird nicht als Teil des Typs einer Funktion betrachtet." zusammen mit [basic.start.main] 3.6.1/2: "...' main' ... soll einen deklarierten Rückgabetyp vom Typ 'int' haben, ansonsten ist der Typ implementierungsdefiniert." – Angew

+0

@Angew Aber seit C++ 17 noexcept-Spezifikation ist ein Teil des Funktionstyps. – songyuanyao

Verwandte Themen