Typ theoretisch gesprochen, voidheißt das in anderen Sprachen unitoder top. Sein logisches Äquivalent ist Wahr . Jeder Wert kann legitimiert umgewandelt werden void(jeder Typ ist ein Subtyp von void). Betrachten Sie es als "Universum" -Set; Es gibt keine gemeinsamen Operationen für alle Werte auf der Welt, daher gibt es keine gültigen Operationen für einen Wert vom Typ void. Anders ausgedrückt: Wenn Sie sagen, dass etwas zum Universum gehört, erhalten Sie keinerlei Informationen - Sie wissen es bereits. Das Folgende ist also Ton:
(void)5;
(void)foo(17); // whatever foo(17) does
Die folgende Zuordnung lautet jedoch nicht:
void raise();
void f(int y) {
int x = y!=0 ? 100/y : raise(); // raise() returns void, so what should x be?
cout << x << endl;
}
[[noreturn]], Auf der anderen Seite, manchmal genannt wird empty, Nothing, Bottomoder Botund ist die logische Äquivalent Falsch . Es hat überhaupt keine Werte, und ein Ausdruck dieses Typs kann in einen beliebigen Typ umgewandelt werden (dh ist ein Subtyp eines beliebigen Typs). Dies ist die leere Menge. Beachten Sie, dass jemand, der Ihnen sagt, dass "der Wert des Ausdrucks foo () zur leeren Menge gehört", sehr informativ ist - er sagt Ihnen, dass dieser Ausdruck niemals seine normale Ausführung abschließen wird. es wird abbrechen, werfen oder hängen. Es ist das genaue Gegenteil von void.
Das Folgende macht also keinen Sinn (Pseudo-C ++, da noreturnes sich nicht um einen erstklassigen C ++ - Typ handelt)
void foo();
(noreturn)5; // obviously a lie; the expression 5 does "return"
(noreturn)foo(); // foo() returns void, and therefore returns
Die folgende Zuordnung ist jedoch absolut legitim, da throwder Compiler versteht, dass er nicht zurückgibt:
void f(int y) {
int x = y!=0 ? 100/y : throw exception();
cout << x << endl;
}
In einer perfekten Welt können Sie noreturnals Rückgabewert für die raise()obige Funktion Folgendes verwenden:
noreturn raise() { throw exception(); }
...
int x = y!=0 ? 100/y : raise();
Leider erlaubt C ++ dies nicht, wahrscheinlich aus praktischen Gründen. Stattdessen können Sie [[ noreturn ]]Attribute verwenden, mit denen Sie Compileroptimierungen und Warnungen steuern können.