Maison  >  Article  >  développement back-end  >  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
Mary-Kate Olsenoriginal
2024-11-07 03:40:03741parcourir

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}};

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 } };

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 };

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 };

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!

Déclaration:
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