En C , les listes d'initialisation constituent un moyen pratique d'initialiser un objet agrégé ou un tableau. Cependant, lorsque vous travaillez avec certaines structures de données telles que std::array et les structures agrégées, la syntaxe nécessite des accolades supplémentaires, laissant de nombreux programmeurs se demander pourquoi.
std::array est un conteneur de taille fixe déclaré comme type de données agrégées, ce qui signifie qu'il n'a pas de constructeur défini par l'utilisateur. En tant qu'agrégat, std::array initialise directement ses membres, y compris le tableau interne.
Pour initialiser directement le tableau interne, des accolades supplémentaires sont nécessaires. Prenons l'exemple suivant :
std::array<int, 2> a1 = {{0, 1}, {2, 3}};
Ici, les accolades autour de {0, 1} et {2, 3} sont essentielles car elles indiquent que l'initialisation concerne le tableau interne dans a1. Sans ces accolades, le code produirait une erreur de compilation en raison d'un trop grand nombre d'initialiseurs.
Contrairement à std::array, les types de base comme double ne le font pas nécessitent des accolades supplémentaires dans les listes d'initialisation. C’est parce qu’il ne s’agit pas d’agrégats. Par exemple :
std::array<double, 2> a2 = {0.1, 2.3};
Dans ce cas, a2 est un tableau de valeurs doubles. Puisque double n'est pas un agrégat, l'initialisation n'implique aucun tableau interne et les accolades supplémentaires ne sont pas nécessaires.
L'exigence d'accolades supplémentaires s'étend au-delà de std::array . D'autres types impliquant des agrégats en nécessitent également. Par exemple :
struct B { int foo[2]; }; B meow1 = {1, 2}; // OK (fully-braced) B bark1 = {{1, 2}}; // OK (extra braces for inner aggregate) struct C { int a, b; }; C meow2 = {1, 2}; // OK (completely elided braces) C bark2 = {{1, 2}}; // OK (extra braces for inner aggregate) struct D { int foo[2]; }; D meow3 = {{1, 2}, {3, 4}}; // error (neither braced-elided nor fully-braced) D bark3 = {{{1, 2}, {3, 4}}}; // OK (extra braces for inner aggregate)
Pour résumer, des accolades supplémentaires sont requises dans les listes d'initialisation lors de l'initialisation d'agrégats comme std::array et certaines structures car elles dénotent l'initialisation du tableau interne ou les membres de l'agrégat. Comprendre cette distinction est crucial pour éviter les erreurs de compilation et garantir la bonne initialisation de telles structures de données.
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!