メンバー配列の初期化子リスト: A C 0x パズル
C 0x では、初期化子リストの導入により、データ初期化の新しい可能性が開かれました。メンバー。ただし、const メンバーの配列でこれらを使用しようとすると、よくある誤解が生じる可能性があります。
次のコードを考えてみましょう:
<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>
予想に反して、このコードはコンパイルに失敗します。 error:
<code class="text">incompatible types in assignment of ‘std::initializer_list<const int>’ to ‘const int [2]’</code>
この問題は、配列メンバーのデータが定数であるのに対し、初期化子リスト ini が非定数値を保持しているという事実に起因します。この不一致を解決するには、コンパイラは初期化子リスト内の各値に対して const 変換を実行する必要があります。ただし、これは言語仕様では許可されていません。
Variadic Template Constructor to the Rescue
初期化子リスト コンストラクターを使用する代わりに、Variadic Template Constructor を使用できます。 :
<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>
このコンストラクターは可変数のパラメーターを受け取り、配列要素の直接初期化を可能にします。初期化フェーズ {ts...} での brace-init-lists の使用に注意してください。
非定数の場合
定数が要件ではない場合は、別のこのアプローチは、コンストラクターでの初期化をスキップし、関数本体で配列を埋めることです。
<code class="cpp">struct Foo { int x[2]; Foo(std::initializer_list<int> il) { std::copy(il.begin(), il.end(), x); } };</code>
このメソッドはコンパイル時の境界チェックを失いますが、特定の状況では依然として実行可能なオプションです。
以上が初期化子リストは C 0x の const メンバー配列を初期化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。