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.