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

Les listes d'initialisation peuvent-elles initialiser des tableaux de membres const en C 0x ?

Barbara Streisand
Libérer: 2024-11-02 16:15:29
original
281 Les gens l'ont consulté

Can initializer lists initialize const member arrays in C  0x?

Listes d'initialisation pour les tableaux membres : un casse-tête C 0x

En C 0x, l'introduction des listes d'initialisation a ouvert de nouvelles possibilités d'initialisation des données membres. Cependant, une idée fausse courante peut survenir lorsque l'on tente de les utiliser avec des tableaux de membres const.

Considérez le code suivant :

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

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

int main() {
    Foo f = {1, 3};
}</code>
Copier après la connexion

Contrairement aux attentes, ce code ne pourra pas être compilé avec le erreur :

<code class="text">incompatible types in assignment of ‘std::initializer_list<const int>’ to ‘const int [2]’</code>
Copier après la connexion

Le problème vient du fait que les données des membres du tableau sont constantes, tandis que la liste d'initialisation ini contient des valeurs non constantes. Pour résoudre cette incompatibilité, le compilateur devra effectuer une conversion const sur chaque valeur de la liste d'initialisation. Cependant, cela n'est pas autorisé par les spécifications du langage.

Constructeur de modèles variadiques à la rescousse

Au lieu d'utiliser un constructeur de liste d'initialisation, un constructeur de modèles variadiques peut être utilisé :

<code class="cpp">struct Foo {
    int x[2];
    template <typename... T>
    Foo(T... ts) : x{ts...} {}
};

int main() {
    Foo f1(1, 2);
    Foo f2{1, 2};
}</code>
Copier après la connexion

Ce constructeur prend un nombre variable de paramètres, permettant une initialisation directe des éléments du tableau. Notez l'utilisation de brace-init-lists dans la phase d'initialisation {ts...}.

Cas non constant

Si la constance n'est pas une exigence, un autre L'approche consiste à ignorer l'initialisation dans le constructeur et à remplir le tableau dans le corps de la fonction :

<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

Cette méthode perd la vérification des limites au moment de la compilation, mais reste une option viable dans certaines situations.

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!