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