Typ theoretisch gesprochen, void
heißt das in anderen Sprachen unit
oder 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
, Bottom
oder Bot
und 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 noreturn
es 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 throw
der 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 noreturn
als 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.