constexpr int get() { return 5; }
template<int N> struct Test {};
int main()
{
int a[get()]; // ok
Test< get() > obj; // error:'int get()' cannot appear in a constant-expression
}
Tengo compiled this code with ideone. Y me preguntaba por qué está dando error de compilación. ¿La función constexpr
no está permitida como argumento template
o es un error en el compilador?¿Es válido usar la función constexpr como argumento de plantilla?
Editar: cambió const int get()
-int get()
Por otra parte, hay una más fallo con Ideone es que, si se quita a continuación constexpr
still declaring an array is allowed !! Creo que es una característica C99.
Tu edición es incorrecta, la has hecho 'constexpr const get()'. – GManNickG
@GMan, gracias ... – iammilind
En la edición, esta es una característica C99, y gcc la tiene como extensión, pero no es C++ adecuada, y no será portátil. Se consideró su inclusión en el estándar y se rechazó porque rompería la invariabilidad de que los tipos (el tamaño es parte del tipo) deben conocerse en tiempo de compilación. En C no importa mucho, pero en C++ no podrías usar esa matriz como un argumento tipo para una plantilla (tipo exacto desconocido en tiempo de compilación) --que por cierto es el comportamiento en gcc, lo hará quejarse si intentas hacerlo –