ホームページ >バックエンド開発 >C++ >初期化子リストは C 0x の const メンバー配列を初期化できますか?

初期化子リストは C 0x の const メンバー配列を初期化できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 16:15:29368ブラウズ

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

メンバー配列の初期化子リスト: 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。