6

誰かがこれらの2つの用語のより明確な説明を提供できますか?

つまり、例を挙げて簡単に説明してください。

(from:cppreference.com)

MoveInsertable:このタイプの右辺値を初期化されていないストレージにコピーできることを指定します。

CopyInsertable:このタイプのインスタンスを、初期化されていないストレージのインプレースでコピー構築できることを指定します。

4

1 に答える 1

8

Tこれらの要件は、タイプとコンテナーの間の関係Xです。コンテナにはアロケータタイプがありA、これを使用して、含まれているオブジェクトにメモリを割り当てます。

mがこれらのアロケータの1つである場合、 pa T*rv型の右辺値T、およびv型の式T

  1. CopyInsertable規格では次のように定義されています。

    TCopyInsertableintoはX、次の式が整形式であることを意味します。

    allocator_traits<A>::construct(m, p, v);
    
  2. MoveInsertable規格では次のように定義されています。

    TMoveInsertableintoはX、次の式が整形式であることを意味します。

    allocator_traits<A>::construct(m, p, rv);
    

これらの定義を理解するには、何をするのかを知る必要がallocator_traits<A>::constructあります。非常に簡単に言えば、この場合は次のように呼び出されます。

m.construct(p, v) // CopyInsertable case
m.construct(p, rv) // MoveInsertable case

vの引数に適用されるrvため、ここでもそれぞれの値のカテゴリがあります。std::forwardallocator_traits<A>::construct

では、アロケータconstructメンバー関数は何をするのでしょうか?ご想像のとおり、次のようTにして、その場所にタイプのオブジェクトを作成します。p

::new ((void*)p) T(v) // CopyInsertable case
::new ((void*)p) T(rv) // MoveInsertable case

繰り返しますがv、edです。rvstd::forward

もちろん、これらはそれぞれコピーまたは移動コンストラクターを呼び出します。

それで:

  1. Tis CopyInsertableintoX:缶配置のアロケータ-newはX、の要素を構築し、Tタイプの式を渡しますT
  2. Tis MoveInsertableintoX:缶配置のアロケータ-newXは、の要素を構築し、T型の右辺値を渡しますT
于 2013-02-16T23:07:12.647 に答える