2011-06-15 12 views
10
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 constexprstill declaring an array is allowed !! Creo que es una característica C99.

+0

Tu edición es incorrecta, la has hecho 'constexpr const get()'. – GManNickG

+0

@GMan, gracias ... – iammilind

+3

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 –

Respuesta

13

GCC 4.5 (al menos la versión utilizada en Ideone) no es completamente compatible con constexpr, incluyendo su uso válido; se diluye en const. GCC 4.6 y superior lo admite correctamente.

Cuestiones relacionadas