Maison > développement back-end > C++ > le corps du texte

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
Libérer: 2024-11-02 17:32:29
original
398 Les gens l'ont consulté

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

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]’
Copier après la connexion

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

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

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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!