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