Saya mengambil ini di salah satu upaya singkat saya ke reddit:
http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/
Pada dasarnya, penulis menunjukkan bahwa di C ++:
throw "error"
adalah ekspresi. Ini sebenarnya dijelaskan dengan cukup jelas dalam Standar C ++, baik dalam teks utama maupun tata bahasa. Namun, yang tidak jelas (setidaknya bagi saya) adalah jenis ekspresi apa? Saya menebak " void
", tetapi sedikit bereksperimen dengan g ++ 4.4.0 dan Comeau menghasilkan kode ini:
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
}
Kompiler tidak memiliki masalah dengan // 1 tetapi muncul di // 2 karena tipe dalam operator bersyarat berbeda. Jadi jenis throw
ekspresi sepertinya tidak kosong.
Jadi apa itu?
Jika Anda menjawab, harap dukung pernyataan Anda dengan kutipan dari Standard.
Ini ternyata bukan tentang jenis ekspresi lemparan melainkan bagaimana operator bersyarat menangani ekspresi lemparan - sesuatu yang pasti tidak saya ketahui sebelum hari ini. Terima kasih untuk semua yang menjawab, tetapi khususnya untuk David Thornley.