Inicialização padrão é um termo do padrão que significa potencialmente nenhuma inicialização, então você provavelmente quer dizer inicialização zero .
A descrição em cppreference.com é um pouco enganosa. std::array
é uma classe agregada, e se o tipo de elemento for primitivo, é POD: "plain old data", com semântica que se aproxima da linguagem C. O construtor implicitamente definido de std::array< int, N >
é um construtor trivial que não faz absolutamente nada.
A sintaxe como std::array< int, 3 >()
ou std::array< int, 3 > x{}
que fornece valores zerados não o faz invocando um construtor. Obter zeros faz parte da inicialização de valor , especificada em C ++ 11 §8.5 / 8:
Inicializar o valor de um objeto do tipo T significa:
- se T é um tipo de classe (possivelmente qualificado pelo cv) sem um construtor padrão fornecido pelo usuário ou excluído, então o objeto é inicializado com zero ..., e se T tem um construtor padrão não trivial, o objeto é inicializado por padrão;
std::array
não tem um construtor padrão fornecido pelo usuário, portanto, é inicializado com zero. Ele tem um construtor padrão definido implicitamente, mas é trivial, portanto, nunca é inicializado por padrão. (Mas isso não faz diferença, pois a inicialização trivial, por definição, não tem efeito no tempo de execução.)
se não, existe uma sintaxe que funcionará em todos os arrays (incluindo arrays de tamanho zero) para inicializar todos os elementos com seu valor padrão?
Matrizes de estilo C e std::array
são agregados, e a maneira de inicializar completamente com zero qualquer agregado é com a sintaxe = {}
. Isso funciona desde C ++ 98. Observe que os arrays de estilo C não podem ter extensão zero, e isso sizeof (std::array< X, 0 >)
não é zero.
T x[N]
sintaxe.