Aquí hay algo que observé en varios compiladores. Parece que hay errores de compilación.¿Por qué el manejo de expresiones de parámetros de plantillas sin tipo es inconsistente en los compiladores?
template <int I>
struct X
{ };
int main(void)
{
X<(16 > 1)> a; // Works on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<(int(16) > 1)> b; // Works on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<(16 >> 1)> c; // Works on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<(int(16) >> 1)> d; // Fails on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<16 > 1> e; // Fails on vc9, works on g++ 4.1.2, fails on Comeau 4.3.10.1
X<int(16) > 1> f; // Fails on vc9, fails on g++ 4.1.2, fails on Comeau 4.3.10.1
X<16 >> 1> g; // Fails on vc9, works on g++ 4.1.2, fails on Comeau 4.3.10.1
X<int(16) >> 1> h; // Fails on vc9, works on g++ 4.1.2, fails on Comeau 4.3.10.1
}
¿Por qué esa inconsistencia? ¿Qué está permitido/no permitido por el estándar? Tal comportamiento también es responsable del error de sintaxis al usar BOOST_AUTO en vc9. Me parece que Comeau está haciendo el trabajo correcto al rechazar todas las expresiones sin paréntesis.
no creo que tenga nada que ver con la plantilla no ser de tipo, sino más bien porque usa el caracter '>' dentro de la plantilla. – Marcin
Tiene razón, Marcin, he visto este comportamiento incoherente con operadores ">" y ">>" sobrecargados de clases definidas por el usuario. – Sumant
Porque sería una construcción poco utilizada y, por lo tanto, menos probada. Y de todos modos estarías loco por usarlos en código real. Pero vale la pena presentar estos como pruebas al fabricante del compilador para que puedan agregarlo a su serie de pruebas de locos que hacen las personas. –