L'ho raccolto in una delle mie brevi incursioni su reddit:
http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/
Fondamentalmente, l'autore sottolinea che in C ++:
throw "error"
è un'espressione. Questo è effettivamente spiegato abbastanza chiaramente nello standard C ++, sia nel testo principale che nella grammatica. Tuttavia, ciò che non è chiaro (almeno per me) è qual è il tipo di espressione? Ho indovinato " void
", ma un po 'di sperimentazione con g ++ 4.4.0 e Comeau ha prodotto questo codice:
void f() {
}
struct S {};
int main() {
int x = 1;
const char * p1 = x == 1 ? "foo" : throw S(); // 1
const char * p2 = x == 1 ? "foo" : f(); // 2
}
I compilatori non hanno avuto problemi con // 1 ma hanno bloccato // 2 perché i tipi nell'operatore condizionale sono diversi. Quindi il tipo di throw
espressione non sembra essere nullo.
Quindi, cos'è?
Se rispondi, esegui il backup delle tue affermazioni con citazioni dallo Standard.
Si è scoperto che non riguardava tanto il tipo di espressione di lancio quanto il modo in cui l'operatore condizionale gestisce le espressioni di lancio - qualcosa di cui certamente non sapevo prima di oggi. Grazie a tutti coloro che hanno risposto, ma in particolare a David Thornley.