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!