Comeau compila sin errores (aquí está mi caso mínimo prueba compilables):
int main(void)
{
int x = 17;
return x ? throw "Something wrong happened" : 5;
}
que es bastante buena evidencia de que es permitido por la norma. También lo es el hecho de que MSVC falla, en lugar de fallar limpiamente con un error.
Además, parece que se fije en 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
y x64 versió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
Actualiza su compilador, si es posible, esto está lejos de ser el único error corregido en 2010.
Independientemente de este código válido estar o no de acuerdo con la norma, cuando un compilador se bloquea con un error interno del compilador (que es lo que VC hace, IIUC), entonces eso es un error en el compilador. Se supone que un compilador debe emitir un mensaje significativo incluso para el código defectuoso, no un informe de fallas. – sbi
Tenga en cuenta que este es el * operador condicional *, que resulta ser * a * operador ternario. – GManNickG
Sí, me confundí cuando "ternario" no estaba en la especificación en ninguna parte. –