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!