誰かがこれらの2つの用語のより明確な説明を提供できますか?
つまり、例を挙げて簡単に説明してください。
(from:cppreference.com)
MoveInsertable:このタイプの右辺値を初期化されていないストレージにコピーできることを指定します。
CopyInsertable:このタイプのインスタンスを、初期化されていないストレージのインプレースでコピー構築できることを指定します。
誰かがこれらの2つの用語のより明確な説明を提供できますか?
つまり、例を挙げて簡単に説明してください。
(from:cppreference.com)
MoveInsertable:このタイプの右辺値を初期化されていないストレージにコピーできることを指定します。
CopyInsertable:このタイプのインスタンスを、初期化されていないストレージのインプレースでコピー構築できることを指定します。
T
これらの要件は、タイプとコンテナーの間の関係X
です。コンテナにはアロケータタイプがありA
、これを使用して、含まれているオブジェクトにメモリを割り当てます。
m
がこれらのアロケータの1つである場合、 p
a T*
、rv
型の右辺値T
、およびv
型の式T
:
CopyInsertable
規格では次のように定義されています。
T
CopyInsertable
intoはX
、次の式が整形式であることを意味します。allocator_traits<A>::construct(m, p, v);
MoveInsertable
規格では次のように定義されています。
T
MoveInsertable
intoは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::forward
allocator_traits<A>::construct
では、アロケータconstruct
メンバー関数は何をするのでしょうか?ご想像のとおり、次のようT
にして、その場所にタイプのオブジェクトを作成します。p
::new ((void*)p) T(v) // CopyInsertable case
::new ((void*)p) T(rv) // MoveInsertable case
繰り返しますがv
、edです。rv
std::forward
もちろん、これらはそれぞれコピーまたは移動コンストラクターを呼び出します。
それで:
T
is CopyInsertable
intoX
:缶配置のアロケータ-newはX
、の要素を構築し、T
タイプの式を渡しますT
T
is MoveInsertable
intoX
:缶配置のアロケータ-newX
は、の要素を構築し、T
型の右辺値を渡しますT