J'ai ramassé ceci dans l'une de mes brèves incursions sur reddit:
http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/
En gros, l'auteur souligne qu'en C ++:
throw "error"
est une expression. Ceci est en fait assez clairement défini dans le standard C ++, à la fois dans le texte principal et dans la grammaire. Cependant, ce qui n'est pas clair (du moins pour moi), c'est quel est le type de l'expression? J'ai deviné " void
", mais un peu d'expérimentation avec g ++ 4.4.0 et Comeau a donné ce code:
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
}
Les compilateurs n'ont eu aucun problème avec // 1 mais ont barfié // 2 parce que les types dans l'opérateur conditionnel sont différents. Le type d' throw
expression ne semble donc pas nul.
Alors c'est quoi?
Si vous répondez, veuillez sauvegarder vos déclarations avec des citations de la norme.
Il s'est avéré que cela ne concernait pas tant le type d'une expression throw que la façon dont l'opérateur conditionnel traite les expressions throw - quelque chose que je ne savais certainement pas avant aujourd'hui. Merci à tous ceux qui ont répondu, mais particulièrement à David Thornley.