class C
{
public:
C() : arr({1,2,3}) //doesn't compile
{}
/*
C() : arr{1,2,3} //doesn't compile either
{}
*/
private:
int arr[3];
};
Creo que la razón es que las matrices solo se pueden inicializar con =
sintaxis, es decir:
int arr[3] = {1,3,4};
Preguntas
- ¿Cómo puedo hacer lo que quiero hacer (es decir, inicializar una matriz en un constructor (sin asignar elementos en el cuerpo)). ¿Es siquiera posible?
- ¿El estándar C ++ 03 dice algo especial sobre la inicialización de agregados (incluidas las matrices) en los inicializadores de ctor? ¿O la invalidez del código anterior es un corolario de algunas otras reglas?
- ¿Las listas de inicializadores C ++ 0x resuelven el problema?
PD: Por favor, no menciones los vectores, boost :: arrays y su superioridad a los arrays, que yo conozco bien.
c++
c++11
initializer-list
ctor-initializer
aggregate-initialization
Armen Tsirunyan
fuente
fuente
Respuestas:
Si. Está usando una estructura que contiene una matriz. Dices que ya lo sabes, pero luego no entiendo la pregunta. De esta manera, se hace inicializar una matriz en el constructor, sin asignaciones en el cuerpo. Esto es lo que
boost::array
hace.Un mem-initializer usa inicialización directa. Y las reglas de la cláusula 8 prohíben este tipo de cosas. No estoy exactamente seguro sobre el siguiente caso, pero algunos compiladores lo permiten.
Consulte este PR de GCC para obtener más detalles.
Ellos si. Sin embargo, creo que su sintaxis no es válida. Tienes que usar llaves directamente para disparar la inicialización de la lista
fuente
char * const foo[6];
miembro de la clase. Se requiere el inicializador para compilar en C ++ 11.C ++ 98 no proporciona una sintaxis directa para nada más que poner a cero (o para elementos que no son POD, inicializar valor) la matriz. Para eso solo escribe
C(): arr() {}
.Creo que Roger Pate está equivocado acerca de las supuestas limitaciones de la inicialización agregada de C ++ 0x, pero soy demasiado vago para buscarlo o verificarlo, y no importa, ¿verdad? EDITAR : Roger estaba hablando de "C ++ 03", lo leí mal como "C ++ 0x". Lo siento, Roger. ☺
Una solución de C ++ 98 para su código actual es envolver la matriz en a
struct
e inicializarla a partir de una constante estática de ese tipo. De todos modos, los datos deben residir en algún lugar. De improviso, puede verse así:fuente
Solución alterna:
fuente
En C ++ 03, la inicialización agregada solo se aplica con una sintaxis similar a la siguiente, que debe ser una declaración separada y no cabe en un inicializador de ctor.
fuente
Qué tal si
?
Compila bien en g ++ 4.8
fuente
¿Quieres iniciar una matriz de entradas en tu constructor? Apúntelo a una matriz estática.
fuente