El siguiente código demuestra un comportamiento de gcc 4.6.2 que no puedo explicar. La primera función declara una matriz estática de tipo vec_t, donde vec_t es un alias typedef'd para char sin signo. La segunda función es idéntica, excepto que el tipo de vect_t es un parámetro de plantilla. La segunda función no puede compilarse con el error de diagnóstico: el tamaño de almacenamiento de 'bitVec' no es constante ".¿Error del compilador? g ++ permite matrices estáticas de tamaño variable, a menos que la función esté templada
#include <limits>
void bitvec_func()
{
const std::size_t nbits = 1e7;
typedef unsigned char vec_t;
const std::size_t WLEN = std::numeric_limits<vec_t>::digits;
const std::size_t VSIZ = nbits/WLEN+1;
static vec_t bitVec[nbits/VSIZ]; // Compiles fine
}
template <typename T>
void bitvec_func()
{
const std::size_t nbits = 1e7;
typedef T vec_t;
const std::size_t WLEN = std::numeric_limits<vec_t>::digits;
const std::size_t VSIZ = nbits/WLEN+1;
static vec_t bitVec[nbits/VSIZ]; // "error: storage size of ‘bitVec’ isn’t constant"
}
void flarf()
{
bitvec_func();
bitvec_func<unsigned char>();
}
Me parece que una instancia de la plantilla con el argumento < unsigned char> debería hacer que el compilador generar el mismo código que la primera función. ¿Alguien puede ofrecer alguna idea de por qué este no parece ser el caso?
[Adición: la segunda función se compilar con "-std = C++ 0x" o "-std = gnu ++ 0x", pero todavía me gustaría entender cómo/si está mal bajo la anteriores definiciones de la lengua]
ETA:.
la segunda función compilará si el inicializador para nbits se cambia:
const std::size_t nbits = 1e7; // Error
const std::size_t nbits = (std::size_t)1e7; // Okay
const std::size_t nbits = 10000000.0; // Error
const std::size_t nbits = 10000000; // Okay
En otras palabras, parece que si nbits
se inicia con una expresión de una integral tipo, entonces nbits
se trata como constante en la definición de bitVec
. Si nbits
se inicializa con una expresión de coma flotante, el compilador ya no lo ve como constante en la expresión de la dimensión bitVec
, y la compilación falla.
Soy mucho menos cómodo llamando "error de compilación" en C++ que en C, pero no puedo pensar en ninguna otra razón por la que los 4 casos anteriores no sean semánticamente idénticos. ¿Alguien más se preocupa por opinar?
¿Podría publicar el código exacto que le está dando un error de compilación? Parece que no puedo reproducirlo. –
Ese es el código exacto de arriba. El compilador es gcc 4.6.2 y las opciones son "-O0 -g3 -c". –
En un gcc 4.3.4 anterior, este código [compilado bien] (http://ideone.com/65Cl7). –