Wybrałem to w jednym z moich krótkich wypadów do reddit:W C++, jeśli rzut jest wyrażeniem, jaki jest jego typ?
http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/
Zasadniczo, autor zwraca uwagę, że w C++:
throw "error"
jest wyrazem. Jest to dość jasno określone w standardzie C++, zarówno w tekście głównym, jak i gramatyce. Jednak nie jest jasne (przynajmniej dla mnie), jaki jest typ tego wyrażenia? Domyślałem „void
”, ale trochę eksperymentować z g ++ 4.4.0 i Comeau dały ten kod:
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
}
Kompilatory nie miałem problemu z // 1 // ale barfed na 2 ponieważ typów w Operator warunkowy jest inny. Tak więc typ wyrażenia throw
nie wydaje się być nieważny.
Co to jest?
Jeśli odpowiesz, proszę wykonać kopię zapasową wyciągów za pomocą cytatów ze standardu.
To okazało się nie być tak dużo o rodzaju wyrażenia rzutów jak jak warunkowe oferty operator z wyrażeń rzutów - coś, co na pewno nie wiedzieli o przed dzisiaj. Dziękuję wszystkim, którzy odpowiedzieli, ale szczególnie Davidowi Thornleyowi.
+1 Niesamowite pytanie. I sprytny sposób na testowanie tego. –
To łącze wydaje się dość jasne, że typ jest określany przez kompilator, aby być czymkolwiek, czym musi być. – Draemon
Linkowany artykuł został chyba zaktualizowany, odkąd go obejrzałem, i jestem pewien, że tak właśnie jest. Jednak nie mogę go znaleźć w standardzie. –