2016-07-09 19 views
7

Betrachten Sie diese zwei mögliche Definitionen für eine Klasse:Ist es sinnvoll, eine gelöschte Funktion als noexcept zu deklarieren?

Exhibit A:

struct A 
{ 
    A() = delete; 
}; 

Exhibit A ':

struct A 
{ 
    A() noexcept = delete; 
} 

Gibt es einen Punkt, eine gelöschte Funktion als noexcept in deklarieren?

+10

Einfach, nein. Eine Funktion, die gelöscht wird, kann nicht aufgerufen werden (oder im Falle eines Konstruktors verwendet werden, um ein Objekt zu initialisieren), geschweige denn eine Ausnahme auslösen. – Peter

Antwort

7

(Veröffentlicht dies zunächst als Kommentar, sondern ermutigt als Antwort auf Beitrag.)

einfach, nein. Eine Funktion, die gelöscht wird, kann nicht aufgerufen werden (oder im Falle eines Konstruktors verwendet werden, um ein Objekt zu initialisieren), geschweige denn eine Ausnahme auslösen.

Edit:

hvd in den Kommentaren unter diesem noexcept(f()) erwähnt ist f() nicht nennen. Wenn der Konstruktor der Klasse Adelete d ist, wird noexcept(A()) nicht kompiliert, unabhängig davon, ob der Konstruktor noexcept deklariert ist. Dies ist (im Wesentlichen) eine Konsequenz der Anforderung, dass noexcept(expression) einen gültigen Ausdruck erhalten muss - und ein Ausdruck A() für eine Klasse A erfordert einen gültigen Konstruktor.

Revolver_Ocelot weist auch korrekt darauf hin, dass es nicht möglich ist, über noexcept zu überlasten (d. H. Es ist nicht möglich, zwei Funktionen mit der gleichen Signatur zu haben, außer dass eins noexcept ist und eins nicht). Innerhalb einer Definition der Klasse A haben sowohl A() = delete als auch A() noexcept = delete beide den gleichen Effekt, d.h. Klasse A, die keinen Konstruktor ohne Argument haben.

+4

'noexcept' wirkt sich nicht nur auf den Funktionsaufruf aus. Sie haben recht, wenn eine Funktion nicht aufgerufen werden kann, kann der Funktionsaufruf nicht beeinflusst werden. Aber "noexcept" kann im Allgemeinen einen Unterschied machen, auch wenn man nichts aufruft, am deutlichsten durch den "noexcept" -Operator ('noexcept (f())' ruft nicht 'f()') auf. Ich denke, eine gute Antwort sollte auch erklären, warum keiner der anderen Fälle zutrifft (zum Beispiel, wenn all diese anderen Fälle nur für aufrufbare Funktionen gelten, sie nicht für gelöschte Funktionen gelten), oder wenn es möglich ist (was ich vermute) ist nicht), gib ein Gegenbeispiel. – hvd

+1

Es wäre auch hilfreich zu erwähnen, dass man 'noexcept' nicht überladen kann (anders als zB' const'). –

+0

Sie haben beide recht, hvd und Revolver_Ocelot. Ich habe die Antwort bearbeitet, um beide Kommentare zu integrieren (oder zu beantworten). Die einfache Antwort von "nein" gilt immer noch, und die zusätzlichen Informationen, auf die Sie jeweils hinweisen, unterstützen dies. – Peter