Я заметил это в одном из своих кратких набегов на 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 - о чем я определенно не знал до сегодняшнего дня. Спасибо всем, кто ответил, но особенно Дэвиду Торнли.
Ответы:
Согласно стандарту, п. 5.16 параграф 2, первая точка: «Второй или третий операнд (но не оба сразу) являются выражением throw (15.1); результат имеет тип другого и является r-значением». Следовательно, условный оператор не заботится о типе выражения throw, он просто использует другой тип.
Фактически, в параграфе 1 15.1 прямо сказано: «Выражение-бросок имеет тип void».
источник
ISO14882 Раздел 15
источник
void
Из [expr.cond.2] (условный оператор
?:
):Итак,
//1
вы были в первом случае,//2
вы нарушили «одно из следующих должно выполняться», поскольку в этом случае ни один из них не нарушает.источник
Вы можете попросить типографский принтер выплюнуть это за вас :
В основном отсутствие реализации
PrintType
приведет к тому, что отчет об ошибке компиляции будет говорить:поэтому мы действительно можем проверить, что
throw
выражения относятся к типуvoid
(и да, стандартные кавычки, упомянутые в других ответах, подтверждают, что это не результат конкретной реализации, хотя gcc с трудом выводит ценную информацию)источник