Maison > développement back-end > C++ > Pourquoi std :: array nécessite-t-il des accolades doubles pour les listes d'initialisation alors que std :: vector ne le fait pas ?

Pourquoi std :: array nécessite-t-il des accolades doubles pour les listes d'initialisation alors que std :: vector ne le fait pas ?

Mary-Kate Olsen
Libérer: 2024-11-07 03:40:03
original
813 Les gens l'ont consulté

Why does std::array require double curly braces for initializer lists while std::vector doesn't?

Différence de comportement de la liste d'initialisation C pour std :: vector et std :: array

Lors de l'utilisation de listes d'initialisation pour les conteneurs C, une différence déroutante apparaît entre std :: vector et std :: tableau. Explorons les raisons de ce comportement.

Problème :

Considérez le code suivant :

std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
Copier après la connexion

Pourquoi est-il nécessaire d'utiliser du double bouclé accolades pour std::array mais pas pour std::vector?

Réponse :

Le comportement découle de la nature de std::array comme un agrégat. Les agrégats n'ont pas de constructeurs déclarés par l'utilisateur, y compris ceux qui acceptent les listes d'initialisation. Par conséquent, l'initialisation globale de std::array est effectuée via une initialisation "à l'ancienne" en utilisant la syntaxe = :

std::array<int, 4> y = { { 1, 2, 3, 4 } };
Copier après la connexion

Dans cet ancien style, des accolades supplémentaires peuvent être omises, ce qui donne le code équivalent :

std::array<int, 4> y = { 1, 2, 3, 4 };
Copier après la connexion

Cependant, cette élision d'accolades n'est autorisée que lors de l'utilisation de l'initialisation à l'ancienne avec la syntaxe =. L'initialisation directe de la liste, qui n'utilise pas la syntaxe =, ne permet pas l'élision des accolades. Cette limitation est régie par C 11 §8.5.1/11.

Résolution proposée :

Un rapport de défaut (défaut CWG n° 1270) a été généré pour résoudre ce problème. limitation. Si la résolution proposée est adoptée, l'élision des accolades sera autorisée pour toutes les formes d'initialisation de liste, y compris les suivantes :

std::array<int, 4> y{ 1, 2, 3, 4 };
Copier après la connexion

Ce changement apporterait de la cohérence au comportement de std::vector et std::array lors de l'utilisation de listes d'initialisation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal