Я взял это в одном из моих коротких набегов, чтобы 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 не кажется пустым.
Итак, что это такое?
Если вы ответите, пожалуйста, создайте резервные копии своих заявлений с кавычками из Стандарта.
Это оказалось не столько в вопросе типа выражения броска, сколько в том, как условный оператор имеет дело с выражениями выражений - что-то, что я, конечно, не сделал знать о до сегодняшнего дня. Спасибо всем, кто ответил, но особенно Дэвиду Торнли.
