Maison >développement back-end >C++ >Quand utiliser des accolades dans l'initialisation d'agrégat C avec des tableaux ?
Syntaxe d'initialisation ambiguë pour les agrégats contenant des tableaux
En C , lors de l'initialisation d'agrégats contenant des tableaux, l'omission des accolades peut entraîner de la confusion et des erreurs. Cela est évident dans les exemples suivants :
// Error: Too many initializers std::array<A, 2> a1 = { {0, 0.1}, {2, 3.4} }; // Valid std::array<double, 2> a2 = {0.1, 2.3};
Accolades requises pour std::array de structures
Le premier exemple génère une erreur car std::array est un agrégat et n'a pas de constructeur défini par l'utilisateur. L'initialisation de son tableau interne nécessite des accolades explicites, comme le montre la version corrigée :
std::array<A, 2> a1 = { {{0, 0.1}, {2, 3.4}} };
Braces Not Required for std::array of PODs
En revanche, std :: tableau
Cohérence des agrégats
Le principe d'exiger des entretoises pour les membres de l'agrégat s'applique à d'autres types d'agrégats comme eh bien :
// Valid B meow1 = {1, 2}; B bark1 = {{1, 2}}; C meow2 = {1, 2}; C bark2 = {{1, 2}};
Ambiguïté en D
Cependant, l'exemple suivant conduit à une erreur :
// Error: Too many initializers D meow3 = {{1, 2}, {3, 4}}; D bark3 = {{{1, 2}, {3, 4}}};
En D, l'initialiseur car foo est lui-même un tableau. Les accolades dans meow3 sont ambiguës car elles pourraient faire référence soit à l'initialisation de foo, soit à son tableau interne. Pour résoudre l'ambiguïté, des accolades explicites sont nécessaires, comme dans bark3.
Mécanisme d'initialisation des agrégats
Lorsque les accolades sont omises lors de l'initialisation des agrégats, plusieurs règles s'appliquent :
Exemples supplémentaires
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!