Ho scelto questo in uno dei miei brevi incursioni a reddit:In C++, se throw è un'espressione, qual è il suo tipo?
http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/
In sostanza, l'autore fa notare che in C++:
throw "error"
è espressione. Questo è in realtà abbastanza chiaramente enunciato 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 sperimentare con g ++ 4.4.0 e Comeau ceduto 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 avuto nessun problema con // 1 ma barfed su // 2 perché i tipi del operatore condizionale sono diversi. Quindi il tipo di un'espressione throw
non sembra essere nullo.
Quindi che cos'è?
Se si risponde, si prega di eseguire il backup delle dichiarazioni con citazioni dallo standard.
questo si è rivelato di non essere così tanto sul tipo di un'espressione tiro da come i condizionali offerte dell'operatore con le espressioni del tiro - cosa che certamente non sapevo nulla prima di oggi. Grazie a tutti quelli che hanno risposto, ma in particolare a David Thornley.
+1 Domanda impressionante. E un modo intelligente per testarlo. –
Questo collegamento sembra rendere abbastanza chiaro che il tipo è determinato dal compilatore per essere qualunque cosa debba essere. – Draemon
L'articolo collegato è stato aggiornato da quando l'ho guardato, e sono sicuro che sia il caso. Tuttavia, non riesco a trovarlo nello standard. –