Maison  >  Article  >  développement back-end  >  Comment initialiser des tableaux de membres dans les constructeurs C 0x : pourquoi l'utilisation de `std::initializer_list` échoue-t-elle et comment le résoudre ?

Comment initialiser des tableaux de membres dans les constructeurs C 0x : pourquoi l'utilisation de `std::initializer_list` échoue-t-elle et comment le résoudre ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-02 17:32:29401parcourir

How to Initialize Member Arrays in C  0x Constructors: Why Does Using `std::initializer_list` Fail and How to Resolve It?

Listes d'initialisation et tableaux de membres en C 0x

Au début de l'apprentissage de C 0x, il est courant de rencontrer des erreurs de syntaxe lors de l'expérimentation avec nouvelles fonctionnalités. Plus précisément, ce problème survient lors de la tentative d'initialisation d'un tableau de membres dans un constructeur à l'aide d'une liste d'initialisation.

Considérez le code suivant :

<code class="cpp">struct Foo
{
    int const data[2];

    Foo(std::initializer_list<int const>& ini)
    : data(ini)
    {}
};

Foo f = {1,3};</code>

Lors de la compilation, ce code déclenche l'erreur suivante :

incompatible types in assignment of ‘std::initializer_list<const int>&’ to ‘const int [2]’

Pour résoudre cette erreur, l'approche recommandée dans la réponse fournie consiste à utiliser un constructeur de modèle variadique au lieu d'une liste d'initialisation constructeur. L'utilisation de cette méthode garantit la compatibilité des types et permet une initialisation flexible des tableaux membres :

<code class="cpp">struct foo {
    int x[2];
    template <typename... T>
    foo(T... ts) : x{ts...} {} // curly braces syntax for initializer list
};

int main() {
    foo f1(1, 2);   // compiles successfully
    foo f2{1, 2};   // also compiles
    foo f3(42);    // x[1] is zero-initialized
}</code>

Alternativement, si le maintien de la constance n'est pas crucial, vous pouvez opter pour une méthode qui implique de remplir le tableau dans le corps du constructeur :

<code class="cpp">struct foo {
    int x[2]; 
    foo(std::initializer_list<int> il) {
       std::copy(il.begin(), il.end(), x);
    }
};</code>

Bien que cette approche puisse être viable, elle sacrifie la vérification des limites au moment de la compilation fournie par le constructeur de modèle variadique.

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