Maison  >  Article  >  développement back-end  >  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 ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-08 05:07:01442parcourir

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

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

std::vector Initialization

std::vector prend en charge les constructeurs définis par l'utilisateur, y compris ceux qui acceptent une std::initializer_list. Par conséquent, nous pouvons initialiser directement x à l'aide d'accolades sans avoir besoin d'accolades supplémentaires.

initialisation std::array

Contrairement à std::vector, std::array 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 du C.

Dans l'initialisation globale "à l'ancienne", le signe égal et les deux-points sont utilisés :

std::array<int, 4> y = { { 1, 2, 3, 4 } };

Cependant, lors de l'utilisation de direct initialisation 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

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

std::array<int, 4> y{ 1, 2, 3, 4 };

En conclusion, la différence de 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 nécessaires 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.

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