二重空の中括弧{{}}が、ゼロではなく1つの要素を持つstd :: initializer_list <double>を作成するのはなぜですか?

ニコライ・ポリバノフ

私は次のコンストラクターを持っています:

MyItem(std::initializer_list<double> l) {
    std::cout << "l size " << l.size() << ")" << std::endl;
}

これは後で二重中括弧で呼び出されます。

MyItem{{}}

l.size()の結果は1です。

そのような行動の背後にあるメカニズムは何ですか?

ネストされた{}は、唯一の要素のデフォルトコンストラクターのように機能するようですが、ここで型の推定が機能する理由と方法がよくわかりません。

クリス

中括弧(list-initialization)を使用してMyItemオブジェクトを初期化する場合、表示したリストコンストラクターは非常に貪欲です。

これらは空のリストを渡します:

MyItem foo({});
MyItem foo{std::initializer_list<double>{}};

これにより、単一の要素double値が初期化された(0.0))を含むリストが渡されます

MyItem foo{{}};

これが機能するのは、既知のタイプの代わりに中括弧を使用できる特定のコンテキストがあるためです。ここでは、リストコンストラクターを優先することから、指定されたリストにが含まれてdoubleいる必要があることがわかります

完全を期すために、これは空のリストを渡すように見えfooますが、デフォルトのコンストラクターがある場合(または特別な場合にはほぼ同等のことを行う場合)、実際には値が初期化されます。デフォルトのコンストラクターがない場合は、次に示すように、リストコンストラクターが選択されます

MyItem foo{};

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ