Maison > développement back-end > C++ > Pourquoi « std :: array » nécessite-t-il des accolades doubles pour l'initialisation, alors que « std :: vector » n'a besoin que d'accolades simples ?

Pourquoi « std :: array » nécessite-t-il des accolades doubles pour l'initialisation, alors que « std :: vector » n'a besoin que d'accolades simples ?

Barbara Streisand
Libérer: 2024-11-07 07:30:03
original
551 Les gens l'ont consulté

Why Does `std::array` Require Double Curly Braces for Initialization, While `std::vector` Only Needs Single Curly Braces?

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

En C , le comportement initializer_list pour std::vector et std::array diffère considérablement. Considérez les extraits de code suivants :

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

Pourquoi std::array nécessite-t-il des accolades doubles, alors que std::vector ne nécessite que des accolades simples ?

Explication

std::vector a un constructeur défini par l'utilisateur qui prend un std::initializer_list comme argument. Cela permet une initialisation directe de liste à l'aide d'accolades simples.

D'un autre côté, std::array est un type d'agrégat qui n'a aucun constructeur défini par l'utilisateur. Au lieu de cela, il utilise l'initialisation globale, une fonctionnalité héritée du C. L'initialisation globale permet une initialisation à l'aide de doubles accolades.

L'ancienne syntaxe pour l'initialisation globale à l'aide d'accolades et du signe = est également valide :

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

Cependant, cette syntaxe permet l'élision d'accolades dans certains cas, ce qui n'est pas autorisé pour l'initialisation directe de liste avec std::array. Une note de bas de page dans la norme C (C 11 §8.5.1/11) indique que « Les accolades ne peuvent pas être élidées dans d'autres utilisations de l'initialisation de liste. »

Rapport de défaut et résolution proposée

Un rapport de défaut (défaut CWG n° 1270) a été déposé pour répondre à cette restriction. Si la résolution proposée est adoptée, l'élision des accolades sera autorisée pour l'initialisation de la liste directe std::array, rendant valide ce qui suit :

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

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