Peguei isso em uma de minhas breves incursões ao reddit:
http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/
Basicamente, o autor aponta que em C ++:
throw "error"
é uma expressão. Na verdade, isso é explicado com bastante clareza no padrão C ++, tanto no texto principal quanto na gramática. Porém, o que não está claro (pelo menos para mim) é qual é o tipo da expressão? Achei " void
", mas alguns experimentos com g ++ 4.4.0 e Comeau produziram este código:
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
}
Os compiladores não tiveram problemas com // 1, mas vomitaram em // 2 porque os tipos no operador condicional são diferentes. Portanto, o tipo de throw
expressão não parece ser vazio.
Então o que é?
Se você responder, faça backup de suas declarações com citações do Padrão.
Isso acabou não sendo tanto sobre o tipo de expressão de lançamento, mas como o operador condicional lida com expressões de lançamento - algo que eu certamente não sabia antes de hoje. Obrigado a todos que responderam, mas particularmente a David Thornley.