La inicialización predeterminada es un término del Estándar que potencialmente significa que no hay inicialización en absoluto, por lo que probablemente se refiera a la inicialización cero .
La descripción en cppreference.com es en realidad un poco engañosa. std::array
es una clase agregada, y si el tipo de elemento es primitivo, es POD: "datos antiguos sin formato", con semántica que coincide estrechamente con el lenguaje C. El constructor implícitamente definido de std::array< int, N >
es uno trivial que no hace absolutamente nada.
La sintaxis similar std::array< int, 3 >()
o std::array< int, 3 > x{}
que proporciona valores cero no lo hace invocando un constructor. Obtener ceros es parte de la inicialización de valor , especificado en C ++ 11 §8.5 / 8:
Inicializar con valor un objeto de tipo T significa:
- si T es un tipo de clase (posiblemente calificado por cv) sin un constructor predeterminado proporcionado por el usuario o eliminado, entonces el objeto se inicializa en cero ..., y si T tiene un constructor predeterminado no trivial, el objeto se inicializa por defecto;
std::array
no tiene un constructor predeterminado proporcionado por el usuario, por lo que se inicializa en cero. Tiene un constructor predeterminado definido implícitamente, pero es trivial, por lo que nunca se inicializa por defecto. (Pero esto no hace una diferencia ya que la inicialización trivial por definición no tiene ningún efecto en el tiempo de ejecución).
Si no es así, ¿existe una sintaxis que funcione en todas las matrices (incluidas las matrices de tamaño cero) para inicializar todos los elementos a su valor predeterminado?
Los arreglos de estilo C y std::array
ambos son agregados, y la forma de inicializar completamente a cero cualquier agregado es con la sintaxis = {}
. Esto funciona desde C ++ 98. Tenga en cuenta que las matrices de estilo C no pueden tener una extensión cero y que sizeof (std::array< X, 0 >)
no es cero.
T x[N]
sintaxis.