C 0x の初期化子リストとメンバー配列
C 0x の学習の初期段階では、実験中に構文エラーが発生することがよくあります。新しい機能。具体的には、この問題は、初期化子リストを使用してコンストラクター内のメンバー配列を初期化しようとすると発生します。
次のコードを考えてみましょう:
<code class="cpp">struct Foo { int const data[2]; Foo(std::initializer_list<int const>& ini) : data(ini) {} }; Foo f = {1,3};</code>
このコードは、コンパイル時に次のエラーをトリガーします。
incompatible types in assignment of ‘std::initializer_list<const int>&’ to ‘const int [2]’
このエラーを解決するには、提供された回答で推奨されているアプローチには、初期化子リスト コンストラクターの代わりに可変個引数テンプレート コンストラクターを採用することが含まれます。このメソッドを使用すると、型の互換性が確保され、メンバー配列の柔軟な初期化が可能になります:
<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>
また、定数の維持が重要ではない場合は、コンストラクター本体内に配列を設定するメソッドを選択することもできます:
<code class="cpp">struct foo { int x[2]; foo(std::initializer_list<int> il) { std::copy(il.begin(), il.end(), x); } };</code>
このアプローチは実行可能かもしれませんが、可変個引数テンプレート コンストラクターによって提供されるコンパイル時の境界チェックが犠牲になります。
以上がC 0x コンストラクターでメンバー配列を初期化する方法: `std::initializer_list` の使用が失敗する理由とその解決方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。