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 ?
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
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!