128 votes

Initialisation par défaut de std::array ?

Avec C++11 std::array est-ce que j'ai la garantie que la syntaxe std::array<T, N> 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 Référence cpp la description du constructeur par défaut dit :

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

donc la réponse peut être oui. Mais je voudrais en être sûr selon la norme ou la future norme.

185voto

Casey Points 18217

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 pour lesquels vous ne fournissez pas d'initialisateur explicite seront initialisés par défaut (C++11 §8.5/11). Cela inclut les objets de type std::array<T, N> y 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'objet indéterminée : tout type hors classe et hors tableau (§8.5/6). Par conséquent, un tableau d'objets initialisés par défaut avec de tels types aura une valeur indéterminée, par ex :

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

Les tableaux de style c et std::array sont 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 nulle) 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 Initialisation par défaut c'est initialisation de la valeur (8.5/7). Vous pouvez demander l'initialisation des valeurs assez facilement en C++11 en donnant à chaque déclaration un initialisateur vide :

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

Ce qui initialisera la valeur de tous les éléments du tableau à tour de rôle, résultant en plain_int et tous les membres des deux types de tableaux sont initialisés à zéro.

31voto

Potatoswatter Points 70305

Initialisation par défaut est un terme de la norme qui signifie potentiellement pas d'initialisation du tout, donc vous voulez probablement dire Initialisation zéro .

La description de cppreference.com est en fait un peu trompeuse. std::array est une classe d'agrégats, et si le type d'élément est primitif, il s'agit de POD : " plain old data ", dont la sémantique est très proche de celle du langage C. Le constructeur implicitement défini de std::array< int, N > es un trivial un qui ne fait absolument rien.

Syntaxe comme std::array< int, 3 >() o std::array< int, 3 > x{} qui fournissent des valeurs nulles ne le font pas en invoquant un constructeur. L'obtention de zéros fait partie de initialisation de la valeur spécifié dans C++11 §8.5/8 :

Initialiser en valeur un objet de type T signifie :

- si T est un type de classe (éventuellement qualifié cv) sans constructeur par défaut fourni par l'utilisateur ou supprimé, alors l'objet est zéro initialisé , et si T a un constructeur par défaut non trivial, l'objet est initialisé par défaut ;

std::array n'a pas de constructeur par défaut fourni par l'utilisateur, donc il est initialisé à zéro. Il a un constructeur par défaut implicitement défini, mais il est trivial, donc il n'est jamais initialisé par défaut. (Mais cela ne fait pas de différence puisque l'initialisation triviale n'a par définition aucun effet au moment de 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 style C et std::array sont tous les deux des agrégats, et la façon d'initialiser complètement un agrégat est la syntaxe suivante = {} . 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 >) est différent de zéro.

12voto

Cubbi Points 25339

Les deux sites T x[N]; y std::array<T, N> x; initialiser par défaut chaque élément du tableau.

Par exemple, si T = std::string chaque élément sera une chaîne vide. Si T est une classe sans constructeur par défaut, les deux ne compileront pas. Si T = int chaque élément aura une valeur indéterminée (sauf si la déclaration se trouve dans un espace de nom).

4voto

Assaf Raman Points 49

C++11 std::array::fill est une bonne option dans certains cas.

0voto

Lingxi Points 163

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X