class C
{
public:
C() : arr({1,2,3}) //doesn't compile
{}
/*
C() : arr{1,2,3} //doesn't compile either
{}
*/
private:
int arr[3];
};
Acredito que o motivo é que os arrays podem ser inicializados apenas com =
sintaxe, ou seja:
int arr[3] = {1,3,4};
Questões
- Como posso fazer o que quero (ou seja, inicializar uma matriz em um construtor (não atribuindo elementos no corpo)). É mesmo possível?
- O padrão C ++ 03 diz algo especial sobre a inicialização de agregados (incluindo matrizes) em inicializadores de ctor? Ou a invalidade do código acima é um corolário de algumas outras regras?
- As listas de inicializadores C ++ 0x resolvem o problema?
PS Por favor, não mencione vetores, boost :: arrays, e sua superioridade em relação a arrays, que eu conheço bem.
c++
c++11
initializer-list
ctor-initializer
aggregate-initialization
Armen Tsirunyan
fonte
fonte
Respostas:
Sim. Ele está usando uma estrutura que contém uma matriz. Você diz que já sabe disso, mas eu não entendo a pergunta. Dessa forma, você fazer inicializar uma matriz no construtor, sem atribuições no corpo. Isso é o que
boost::array
faz.Um inicializador de mem usa inicialização direta. E as regras da cláusula 8 proíbem esse tipo de coisa. Não tenho certeza sobre o seguinte caso, mas alguns compiladores permitem isso.
Consulte este GCC PR para obter mais detalhes.
Sim, eles fazem. No entanto, sua sintaxe é inválida, eu acho. Você tem que usar chaves diretamente para disparar a inicialização da lista
fonte
char * const foo[6];
membro da classe. Ele requer o inicializador para compilar em C ++ 11.C ++ 98 não fornece uma sintaxe direta para nada além de zerar (ou para elementos não POD, inicialização de valor) o array. Para isso, basta escrever
C(): arr() {}
.Acho que Roger Pate está errado sobre as supostas limitações da inicialização do agregado C ++ 0x, mas estou com preguiça de pesquisar ou verificar, e isso não importa, não é? EDIT : Roger estava falando sobre "C ++ 03", eu interpretei incorretamente como "C ++ 0x". Desculpe, Roger. ☺
Uma solução alternativa do C ++ 98 para o código atual é envolver a matriz em a
struct
e inicializá-la a partir de uma constante estática desse tipo. Os dados devem residir em algum lugar de qualquer maneira. De cara, pode ter a seguinte aparência:fonte
Gambiarra:
fonte
Em C ++ 03, a inicialização agregada só se aplica com sintaxe semelhante à abaixo, que deve ser uma instrução separada e não se encaixa em um inicializador de ctor.
fonte
E se
?
Compila bem no g ++ 4.8
fonte
Você deseja iniciar um array de ints em seu construtor? Aponte para uma matriz estática.
fonte