2013-06-03 8 views
6

最初の部分:std :: initializer_listの基本構造は何ですか?

std::initializer_listは、C++ 11の本当に便利な機能ですので、私はそれが標準ライブラリに実装されているか疑問に思いました。私がhereと読んだところで、コンパイラは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()); 
      

      同じ順序で、ILの要素のそれぞれのコピーを有する容器を構築

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

      まだ移動のセマンティクスには不満はありますが、ilのデータをvectorに移動できませんでしたか?私はstd::vectorの深い実装を認識していませんが、IIRCは平凡な配列を使用しています。

  • +2

    cplusplus.comを信頼しない別の理由のようです。標準に目を向けると、イニシエータリストのctorに到達し、イテレータのctorが呼び出されます(emplace構築を使用して)可能ならば要素を移動します。 – Angew

    +6

    cplusplus.comはひどく恐ろしいサイトで、C++コミュニティに害を及ぼします。誰かがそれをホストしているサーバーを粉砕し、ハードドライブを焼いて、コンクリートで包み込んで海の底に沈めるべきです。 –

    +1

    'std :: initializer_listの根底にある構造は何ですか?'理由があるので、あなたから離れて抽象化されています。 –

    答えて

    12

    std::initializer_listの基本構造は何ですか?

    ほとんどの場合、ちょうど一対のポインタ、またはポインタとサイズです。 C++ 11標準の18.9/2パラグラフでも(非規範的)ノートでこれを言及:タイプinitializer_list<E>

    オブジェクトは、タイプconst Eのオブジェクトの配列へのアクセスを提供します。 [注: ポインターまたはポインターと長さの合計は、initializer_listの明白な表現になります。 initializer_listは、8.5.4で指定されたイニシャライザリストを実装するために使用されます。 initializer listをコピーすると、 は基本要素をコピーしません。末端ノート】また

    私はまだ移動セマンティクスに慣れていないけど、ilのデータがベクトルに移動することができませんでしたか?

    initializer_listの要素が(上記引用された段落の最初の文を参照してください)不変であるために仮定されているので、あなたは、initializer_listの要素から移動することはできません。それはまた、const - 修飾されたメンバー関数だけがあなたに要素へのアクセスを与える理由です。

    +1

    'foo(foo const &&);')のようなコンストラクタは、移動コンストラクタであり、実際には 'std :: initializer_list'のイテレータを' std :: move_iterator'sにラップするか、そのようなトリッキーなものですが、そのようなコンストラクターは便利なことはほとんどありません(または標準のコピー*コンストラクターとは異なることもあります)。 –

    +0

    @LucDanton: 'foo(foo const &&)' ... ew ... :)しかし、 、技術的にはあなたは正しい。 'initializer_list'の要素が不変であるという事実を変更しないので、" move constructor "は未定義の動作を引き起こさずに何かを動かすことができません。 –

    +0

    @AndyProwl:初期化子リストには変数参照を含めることもできます。その場合、移動要素は、参照された要素のデータを移動する。したがって、リスト自体は不変です(常に同じ参照が含まれます)が、移動先が便利な場合があります。 –

    関連する問題