Tôi đã chọn nó trong một trong những lần tìm kiếm ngắn gọn của tôi để reddit:
http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/
Về cơ bản, tác giả chỉ ra rằng trong C ++:
throw "error"
là một biểu hiện. Điều này thực sự được viết khá rõ ràng trong Tiêu chuẩn C ++, cả trong văn bản chính và ngữ pháp. Tuy nhiên, điều không rõ ràng (với tôi ít nhất) là kiểu biểu thức là gì? Tôi đoán là " void
", nhưng một chút thử nghiệm với g ++ 4.4.0 và Comeau đã mang lại mã này:
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
}
Các trình biên dịch không gặp vấn đề gì với // 1 nhưng cản trở // 2 vì các kiểu trong toán tử điều kiện là khác nhau. Vì vậy, kiểu của một throw
biểu thức dường như không có giá trị.
Vậy đo la cai gi?
Nếu bạn trả lời, vui lòng sao lưu các báo cáo của bạn với trích dẫn từ Tiêu chuẩn.
Điều này hóa ra không liên quan nhiều đến loại biểu thức ném như cách toán tử điều kiện xử lý với biểu thức ném - điều mà tôi chắc chắn không biết trước ngày hôm nay. Cảm ơn tất cả những người đã trả lời, nhưng đặc biệt là với David Thornley.