Я заметил это в одном из своих кратких набегов на Reddit:
http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/
В основном автор указывает, что в C ++:
throw "error"
это выражение. На самом деле это довольно четко прописано в стандарте C ++ как в основном тексте, так и в грамматике. Однако не совсем ясно (по крайней мере, мне), что это за тип выражения? Я догадался " void
", но немного поэкспериментировав с g ++ 4.4.0 и Comeau, дал следующий код:
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
}
У компиляторов не было проблем с // 1, но они отказались от // 2, потому что типы в условном операторе разные. Итак, типthrow
выражения не кажется недействительным.
Так что это?
Если вы ответите, пожалуйста, подкрепите свои утверждения цитатами из Стандарта.
Оказалось, что дело не столько в типе выражения throw, сколько в том, как условный оператор работает с выражениями throw - о чем я определенно не знал до сегодняшнего дня. Спасибо всем, кто ответил, но особенно Дэвиду Торнли.