Initialisation par défaut de std :: array?

Avec C ++ 11 std::array , ai-je la garantie que la syntaxe std::array x; va initialiser par défaut tous les éléments du tableau?

EDIT : sinon, existe-t-il une syntaxe qui fonctionne sur tous les tableaux (y compris les tableaux de taille nulle) pour initialiser tous les éléments à leur valeur par défaut?

EDIT : sur cppreference , la description du constructeur par défaut dit:

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

alors la réponse peut être oui. Mais je voudrais être sûr de cela selon la norme ou future norme.

Par définition, l’initialisation par défaut est l’initialisation qui se produit lorsqu’aucune autre initialisation n’est spécifiée. le langage C ++ vous garantit que tout object pour lequel vous ne fournissez pas d’initialiseur explicite sera initialisé par défaut (C ++ 11 §8.5 / 11). Cela comprend les objects de type std::array et T[N] .

Sachez qu’il existe des types pour lesquels l’initialisation par défaut n’a aucun effet et laisse la valeur de l’object indéterminée: tout type non class, non-array (§8.5 / 6). Par conséquent, un tableau d’objects initialisés par défaut avec de tels types aura une valeur indéterminée, par exemple:

 int plain_int; int c_style_array[13]; std::array cxx_style_array; 

Le tableau c-style et le tableau std::array sont tous deux remplis d’entiers de valeur indéterminée, tout comme plain_int a une valeur indéterminée.

Existe-t-il une syntaxe qui fonctionne sur tous les tableaux (y compris les tableaux de taille zéro) pour initialiser tous les éléments à leur valeur par défaut?

Je suppose que lorsque vous dites “à leur valeur par défaut” vous voulez vraiment dire “initialiser tous les éléments à T{} “. Ce n’est pas une initialisation par défaut , c’est une initialisation de valeur (8.5 / 7). Vous pouvez demander l’initialisation de la valeur assez facilement en C ++ 11 en atsortingbuant à chaque déclaration un initialiseur vide:

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

Ce qui initialisera tous les éléments du tableau à leur tour, ce qui plain_old_int pour résultat plain_old_int , et tous les membres des deux types de tableaux, à zéro.

L’initialisation par défaut est un terme de la norme qui signifie potentiellement pas d’initialisation du tout, donc vous voulez probablement dire une initialisation nulle .

La description sur cppreference.com est en fait un peu trompeuse. std::array est une classe agrégée, et si le type d’élément est primitif, c’est POD: “plain old data”, avec une sémantique correspondant étroitement au langage C. Le constructeur implicite de std::array< int, N > est un constructeur sortingvial qui ne fait absolument rien.

La syntaxe comme std::array< int, 3 >() ou std::array< int, 3 > x{} qui fournissent des valeurs nulles ne le fait pas en appelant un constructeur. Obtenir des zéros fait partie de l’ initialisation de la valeur , spécifiée dans C ++ 11 §8.5 / 8:

Valoriser-initialiser un object de type T signifie:

– si T est un type de classe (éventuellement qualifié cv) sans constructeur par défaut fourni ou supprimé par l’utilisateur, alors l’object est initialisé à zéro… et si T a un constructeur par défaut non sortingvial, l’object est initialisé par défaut;

std::array n’a pas de constructeur par défaut fourni par l’utilisateur, il est donc initialisé à zéro. Il a un constructeur implicite défini par défaut, mais c’est sortingvial, il n’est donc jamais initialisé par défaut. (Mais cela ne fait aucune différence puisque l’initialisation sortingviale par définition n’a aucun effet à l’exécution.)

Sinon, existe-t-il une syntaxe qui fonctionne sur tous les tableaux (y compris les tableaux de taille nulle) pour initialiser tous les éléments à leur valeur par défaut?

Les tableaux de type C et std::array sont tous les deux des agrégats, et la syntaxe = {} est la manière d’initialiser complètement les agrégats. Cela fonctionne depuis C ++ 98. Notez que les tableaux de style C ne peuvent pas avoir une étendue nulle et que sizeof (std::array< X, 0 >) n’est pas nul.

Les deux T x[N]; et std::array x; initialise par défaut chaque élément du tableau.

Par exemple, si T = std::ssortingng , chaque élément sera une chaîne vide. Si T est une classe sans constructeur par défaut, les deux ne pourront pas être compilés. Si T = int , chaque élément aura une valeur indéterminée (sauf si cette déclaration se trouve à scope d’espace de noms)

Tout d’abord, T x [N] initialise les éléments par défaut, bien que l’initialisation par défaut d’un type scalaire ne fasse en réalité rien. Ce qui précède vaut également pour std :: array x. Je pense que ce dont vous avez besoin est l’initialisation de la liste.