"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi `std::array` nécessite-t-il des accolades doubles dans les listes d'initialisation ?

Pourquoi `std::array` nécessite-t-il des accolades doubles dans les listes d'initialisation ?

Publié le 2024-11-20
Parcourir:693

Why Does `std::array` Require Double Curly Braces in Initializer Lists?

Comportement de la liste d'initialisation : différences entre std::vector et std::array

Alors que std::vector et std::array sont les deux conteneurs en C , leur comportement avec les listes d'initialisation diffère. Dans cet article, nous explorerons les subtilités de l'initialisation d'agrégat et comprendrons pourquoi des accolades doubles sont requises pour std::array.

Considérez l'extrait de code suivant qui initialise un std::vector et un std:: tableau :

std::vector x{1,2,3,4};
std::array y{{1,2,3,4}};

std::initialisation vectorielle

std::vecteur pris en charge constructeurs définis par l'utilisateur, y compris ceux qui acceptent un std::initializer_list. Par conséquent, nous pouvons initialiser directement x à l'aide d'accolades sans avoir besoin d'accolades supplémentaires. est un agrégat qui n'a pas de constructeurs définis par l'utilisateur. Au lieu de cela, il s'appuie sur l'initialisation globale, une fonctionnalité héritée de C.

Dans l'initialisation globale "à l'ancienne", le signe égal et les deux-points sont utilisés :std::array y = { { 1, 2, 3, 4 } };

Cependant, lors de l'utilisation de l'initialisation directe de liste (introduite en C 11), la syntaxe this = n'est plus valide. De plus, l'élision des accolades, qui permet d'omettre les accolades supplémentaires, n'est autorisée que dans les déclarations avec l'ancienne syntaxe style =. Pour l'initialisation directe de la liste, des accolades supplémentaires sont obligatoires.

Défaut CWG
std::array y = { { 1, 2, 3, 4 } };

Un rapport de défaut CWG (défaut CWG #1270) vise à résoudre cette restriction en permettant l'élision des accolades pour d'autres formes d'initialisation de liste. S'il est adopté, le code suivant serait bien formé :

std::array y{ 1, 2, 3, 4 };En conclusion, la différence dans le comportement entre std :: vector et std :: array avec des listes d'initialisation découle de leurs caractéristiques fondamentales en tant que classe avec des constructeurs définis par l'utilisateur et un agrégat reposant respectivement sur l'initialisation de l'agrégat. Des accolades doubles sont requises pour que std::array se conforme aux règles d'initialisation globale, tandis que std::vector permet une initialisation directe à l'aide d'un seul jeu d'accolades sans s'appuyer sur la syntaxe d'initialisation globale à l'ancienne.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3