ホームページ > バックエンド開発 > C++ > C 0x コンストラクターでメンバー配列を初期化する方法: `std::initializer_list` の使用が失敗する理由とその解決方法

C 0x コンストラクターでメンバー配列を初期化する方法: `std::initializer_list` の使用が失敗する理由とその解決方法

Mary-Kate Olsen
リリース: 2024-11-02 17:32:29
オリジナル
492 人が閲覧しました

How to Initialize Member Arrays in C  0x Constructors: Why Does Using `std::initializer_list` Fail and How to Resolve It?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート