6

最初の部分:

std::initializer_listは C++11 の非常に便利な機能なので、標準ライブラリでどのように実装されているのか疑問に思いました。ここで読んだことから、コンパイラは型の配列を作成Tし、initializer_list<T>.

また、 をコピーするinitializer_listと、同じデータを参照する新しいオブジェクトが作成されると述べています。なぜそうなのですか? 私はそれが次のいずれかだと推測したでしょう:

  • 新しいのデータをコピーしますinitializer_list
  • データの所有権を新しいinitializer_list

後半:

std::vectorコンストラクターの多くのオンライン参照の 1 つから:

vector (initializer_list<value_type> il,
    const allocator_type& alloc = allocator_type());

(6) 初期化リストコンストラクタ

il内の各要素のコピーを同じ順序で含むコンテナを構築します。

移動のセマンティクスにはまだ慣れていませんが、 のデータをilに移動できませんでしたvectorか? の深い実装については知りませんstd::vectorが、IIRC は単純な古い配列を使用します。

4

1 に答える 1

12

の根底にある構造はstd::initializer_list何ですか?

ほとんどの場合、ポインターのペア、またはポインターとサイズです。C++11 標準のパラグラフ 18.9/2 では、(非規範的な) 注記でこれについて言及しています。

type のオブジェクトは、 typeinitializer_list<E>のオブジェクトの配列へのアクセスを提供しますconst E。[ 注: ポインターのペアまたはポインターと長さは、 の明らかな表現ですinitializer_listinitializer_list8.5.4 で指定されている初期化リストを実装するために使用されます。をコピーしinitializer listても、基になる要素はコピーされません。—終わりのメモ]

さらに:

移動セマンティクスにはまだ慣れていませんが、データをilベクターに移動できませんでしたか?

いいえinitializer_list、 an の要素は不変であると想定されているため、an の要素から移動することはできませんinitializer_list(上記の段落の最初の文を参照)。constこれが、修飾されたメンバー関数のみが要素へのアクセスを許可する理由でもあります。

于 2013-06-03T10:29:48.593 に答える