Я взяв це в одному з моїх коротких наборів до reddit:
http://www.smallshire.org.uk/sufficsmall/2009/07/31/in-c-throw-is-an-expression/
В основному автор зазначає, що в C ++:
throw "error"
є виразом. Це насправді досить чітко прописано в стандарті C ++, як в основному тексті, так і в граматиці. Однак, що незрозуміло (мені щонайменше) - це тип виразу? Я здогадався " void
", але трохи експериментуючи з g ++ 4.4.0 і Комо дав цей код:
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
виразу не видається нікчемним.
Так що це?
Якщо ви дасте відповідь, будь ласка, підкріпіть свої заяви цитатами зі стандарту.
Це виявилося не стільки щодо типу виразу викидання, скільки того, як умовний оператор має справу з виразами кидка - те, про що, звичайно, не знав раніше. Дякую всім, хто відповів, але особливо Девіду Торнлі.