J'ai trouvé ça lors d'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. C'est en fait assez clairement expliqué dans la norme C++, à la fois dans le texte principal et dans la grammaire. Cependant, ce qui n'est pas clair (pour moi du moins), c'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 vomi sur //2 parce que les types dans l'opérateur conditionnel sont différents. Ainsi, le type d'un throw
L'expression ne semble pas être nulle.
Alors, qu'est-ce que c'est ?
Si vous répondez, veuillez étayer vos affirmations par des citations de la norme.
Il s'est avéré qu'il ne s'agissait pas tant du type d'une expression de rejet que de la façon dont l'opérateur conditionnel traite les expressions de rejet - quelque chose que je ne connaissais certainement pas avant aujourd'hui. avant aujourd'hui. Merci à tous ceux qui ont répondu, et en particulier à David Thornley.