c++11 initialization default-constructor stdarray

c++11 - Inicialización predeterminada de std:: array



initialization default-constructor (4)

Con C ++ 11 std::array , ¿tengo la garantía de que la sintaxis std::array<T, N> x; ¿Inicializará por defecto todos los elementos de la matriz?

EDITAR : si no, ¿hay una sintaxis que funcione en todas las matrices (incluidas las matrices de tamaño cero) para inicializar todos los elementos a su valor predeterminado?

EDITAR : en cppreference , la descripción del constructor predeterminada dice:

(constructor) (implicitly declared) (public member function) default-constructs or copy-constructs every element of the array

entonces la respuesta puede ser sí. Pero me gustaría estar seguro de eso según el estándar estándar o futuro.


Ambos T x[N]; y std::array<T, N> x; default-initialize cada elemento de la matriz.

Por ejemplo, si T = std::string , cada elemento será una cadena vacía. Si T es una clase sin un constructor predeterminado, ambos no compilarán. Si T = int , cada elemento tendrá un valor indeterminado (a menos que esa declaración esté en el ámbito del espacio de nombres)


En primer lugar, T x [N] inicializa por defecto los elementos, aunque la inicialización predeterminada de un tipo escalar T en realidad no hace nada. Lo anterior también se aplica a std :: array x. Creo que lo que necesitas es inicialización de lista.


Por definición, la inicialización predeterminada es la inicialización que ocurre cuando no se especifica ninguna otra inicialización; el lenguaje C ++ le garantiza que cualquier objeto para el que no proporcione un inicializador explícito se inicializará por defecto (C ++ 11 §8.5 / 11). Eso incluye objetos del tipo std::array<T, N> y T[N] .

Tenga en cuenta que hay tipos para los que la inicialización predeterminada no tiene ningún efecto y deja el valor del objeto indeterminado: cualquier tipo que no sea de clase ni de matriz (§8.5 / 6). En consecuencia, una matriz de objetos inicializados por defecto con dichos tipos tendrá un valor indeterminado, por ejemplo:

int plain_int; int c_style_array[13]; std::array<int, 13> cxx_style_array;

Tanto la matriz c-style como std::array están llenas de enteros de valor indeterminado, del mismo modo que plain_int tiene un valor indeterminado.

¿Hay una sintaxis que funcione en todas las matrices (incluidas las matrices de tamaño cero) para inicializar todos los elementos a su valor predeterminado?

Supongo que cuando dice "a su valor predeterminado", realmente quiere decir "inicializar todos los elementos a T{} ". Eso no es inicialización por defecto , es inicialización de valor (8.5 / 7). Puede solicitar la inicialización de valor con bastante facilidad en C ++ 11 dando a cada declaración un inicializador vacío:

int plain_int{}; int c_style_array[13]{}; std::array<int, 13> cxx_style_array{};

Lo cual valorizará una inicialización de todos los elementos de la matriz, dando como resultado plain_old_int , y todos los miembros de ambos tipos de matrices, siendo inicializados a cero.


Inicialización predeterminada es un término del estándar que potencialmente significa que no hay inicialización, por lo que probablemente se refiera a cero inicialización .

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 simples antiguos", con una semántica que coincide estrechamente con el lenguaje C. El constructor definido implícitamente de std::array< int, N > es trivial y no hace absolutamente nada.

La sintaxis como std::array< int, 3 >() o std::array< int, 3 > x{} que proporcionan valores cero no lo hacen invocando un constructor. Obtener ceros es parte de la inicialización de valores , especificada en C ++ 11 §8.5 / 8:

Valorizar-inicializar un objeto de tipo T significa:

- si T es un tipo de clase (posiblemente cv calificado) 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 implícitamente definido, 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, ¿hay una sintaxis que funcione en todas las matrices (incluidas las matrices de tamaño cero) para inicializar todos los elementos a su valor predeterminado?

Las matrices de estilo C y std::array son agregados, y la forma de inicializar completamente cualquier agregado es con la sintaxis = {} . Esto funciona desde C ++ 98. Tenga en cuenta que las matrices de estilo C no pueden tener extensión cero, y que sizeof (std::array< X, 0 >) no es cero.