Maison  >  Article  >  développement back-end  >  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
Barbara Streisandoriginal
2024-11-07 07:30:03443parcourir

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

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

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

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