Comeau biên dịch nó mà không có lỗi (đây là trường hợp thử nghiệm tối thiểu compilable của tôi):
int main(void)
{
int x = 17;
return x ? throw "Something wrong happened" : 5;
}
đó là bằng chứng khá tốt mà nó cho phép theo tiêu chuẩn. Vì vậy, thực tế là MSVC gặp sự cố, thay vì thất bại với lỗi.
Ngoài ra, nó dường như được cố định trong VC++ 2010
R:\>cl ternarythrowtest.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
ternarythrowtest.cpp
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:ternarythrowtest.exe
ternarythrowtest.obj
và x64 phiên bản:
R:\>cl ternarythrowtest.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 16.00.40219.01 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
ternarythrowtest.cpp
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:ternarythrowtest.exe
ternarythrowtest.obj
Nâng cấp trình biên dịch của bạn nếu có thể, đây là xa lỗi chỉ cố định trong năm 2010.
Nguồn
2011-10-31 18:05:23
Bất kể mã hợp lệ là điều này hay không theo tiêu chuẩn, khi một trình biên dịch treo với một lỗi trình biên dịch nội bộ (đó là những gì VC làm, IIUC), sau đó đó là một lỗi trong trình biên dịch. Trình biên dịch được cho là phát ra một thông điệp có ý nghĩa ngay cả đối với mã bị lỗi, không phải là một báo cáo sự cố. – sbi
Hãy nhớ đây là toán tử * có điều kiện *, điều này xảy ra là toán tử * a * ternary. – GManNickG
Vâng, đã bối rối khi "ternary" không có trong spec ở bất cứ đâu. –