Maison > Article > développement back-end > Les listes d'initialisation peuvent-elles initialiser des tableaux de membres const en 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>
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>
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>
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>
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!