Maison > développement back-end > C++ > 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
Libérer: 2024-11-08 05:07:01
original
487 Les gens l'ont consulté

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}};
Copier après la connexion

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 } };
Copier après la connexion

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 };
Copier après la connexion

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!

source:php.cn
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