Il est bien connu que les initialiseurs manquants pour un tableau de scalaires ont la valeur zéro par défaut.
int A[5]; // Entries remain uninitialized
int B[5]= { 0 }; // All entries set to zero
Mais est-ce garanti (ci-dessous)?
int C[5]= { }; // All entries set to zero
L’initialisation par contreventement vide effectue l’agrégation-initialisation du tableau: ceci conduit à une initialisation nulle des éléments int
.
Oui, c'est garanti.
Oui, selon la règle de initialisation d'agrégat , il est garanti (que tous les éléments du tableau C
seront valeur initialisée , c'est-à-dire zéro -initialisé à 0
dans ce cas).
(c'est moi qui souligne)
Si le nombre de clauses d'initialisation est inférieur au nombre de membres
and bases (since C++17)
ou la liste d'initialiseur est complètement vide , les membres restantsand bases (since C++17)
sont initialisésby their default initializers, if provided in the class definition, and otherwise (since C++14)
par des listes vides, conformément aux règles habituelles d'initialisation de liste (qui effectue l'initialisation de valeur pour les types non-classes et les classes non-agrégées avec des constructeurs par défaut, et l'initialisation des agrégats pour les agrégats).
PS:
int A[5]; // Entries remain uninitialized
"rester non initialisé" pourrait ne pas être précis. Pour int A[5];
, Tous les éléments de A
seront initialisés par défaut . Si A
est un objet statique ou thread-local, les éléments seront initialisés à zéro à 0
, Sinon rien n'est fait, ce sont des valeurs indéterminées.
En fait, quand vous ditesint A[5] = { 0 };
vous dites: Initialisez le premier élément à zéro. Toutes les autres positions sont initialisées à zéro en raison de l’inizialisation globale.
Cette ligne est la vraie responsable d'avoir votre tableau plein de zéros: int A[5] = { };
C'est pourquoi si vous utilisez int A[5] = { 1 };
vous aurez seulement la première position initialisée à 1.