L'initialisation par défaut est un terme du Standard signifiant potentiellement aucune initialisation, donc vous voulez probablement dire initialisation zéro .
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 implicitement défini de std::array< int, N >
est un constructeur trivial qui ne fait absolument rien.
La syntaxe comme std::array< int, 3 >()
ou std::array< int, 3 > x{}
qui fournit 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:
Initialiser par 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 initialisé à zéro…, 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, il est donc initialisé à zéro. Il a un constructeur par défaut défini implicitement, mais il est trivial, il n'est donc jamais initialisé par défaut. (Mais cela ne fait aucune différence puisque l'initialisation triviale par définition n'a aucun effet à l'exécution.)
sinon, existe-t-il une syntaxe qui fonctionnera sur tous les tableaux (y compris les tableaux de taille zéro) pour initialiser tous les éléments à leur valeur par défaut?
Les tableaux de style C et std::array
sont tous deux des agrégats, et la façon d'initialiser complètement à zéro tout agrégat est avec la syntaxe = {}
. Cela fonctionne depuis C ++ 98. Notez que les tableaux de style C ne peuvent pas avoir d'étendue nulle et que ce sizeof (std::array< X, 0 >)
n'est pas zéro.
T x[N]
syntaxe.