vectores una programacion matriz matrices llenar imprimir funciones ejemplos con como codigo caracteres c++ arrays templates initialization compiler-bug

c++ - una - g++(4.7.2) error o característica, al inicializar matrices estáticas en tiempo de compilación?



matriz en c++ codigo (1)

Lo siguiente es ilegal;

static const int a[10] = {}; static const int b[10] = a; // Illegal

Entonces, el error de gcc es, de hecho, para el caso sin plantilla.

Puede usar std::array lugar de C-array.

De acuerdo, así que estaba tratando de hacer algo inteligente inicializando un montón de constexpr static int const en compilación. A pesar de que el rendimiento del tiempo de ejecución no se rige en absoluto por la inicialización de estas matrices, parecía un pequeño ejercicio divertido. Escribí una prueba de configuración para ver si era posible, y terminé pudiendo hacer esto:

struct Test { constexpr static int const array[10] = Array<int, 10, 0, Increment>::array; }; constexpr int const Test::array[10]; int main() { cout << Test::array[3] << ''/n''; }

Aquí, Array tiene un miembro estático llamado array que contiene 10 int s, comenzando en 0, donde el valor de cada elemento subsiguiente está determinado por un functor de metaprogramación de plantillas llamado Increment (es decir {0, 1, ..., 9} ) . Como se esperaba, el programa imprime el número 3 .

Impresionante, ¿verdad? Ahora puedo escribir functors e inicializar matrices con todo tipo de patrones funky en tiempo de compilación. Siguiente paso: descifrar el tamaño de la matriz 10 haciendo que Test una plantilla de clase así:

template <size_t Size> struct Test { constexpr static int const array[Size] = Array<int, Size, 0, Increment>::array; }; template <size_t Size> constexpr int const Test<Size>::array[Size]; int main() { cout << Test<10>::array[3] << ''/n''; }

Sin embargo, de repente ya no compila con el mensaje:

test.cc:43:72: error: array must be initialized with a brace-enclosed initializer

¿Por qué pasó esto? ¿Hay alguna razón por la cual este tipo de inicialización se haya vuelto inválida una vez que convierta la clase en una plantilla de clase, o me haya tropezado con algo no implementado / defectuoso en GCC?

FYI, puedo publicar el resto de mi código (la implementación de Array por ejemplo) a pedido. Por ahora, creo que esto debería ser suficiente.

EDITAR El error se puede reproducir con una implementación diferente y trivial de Array para ahorrar espacio aquí:

template <size_t Size> struct Array { constexpr static int const array[Size] = {}; }; template <size_t Size> struct Test { constexpr static int const array[Size] = Array<Size>::array; };