C++ 名前付き要件: MoveInsertable (since C++11)
From cppreference.com
指定されたアロケータによって、未初期化のストレージにその型の右辺値からオブジェクトを構築できることを指定します。
目次 |
[edit] 要件
以下の型、値、式が与えられた場合
| 型 | 定義 |
T
|
オブジェクト型 |
A
|
アロケータ型 |
X
|
以下のすべての条件を満たすコンテナ型
|
| 値 | 定義 |
| m | 型 A の左辺値 |
| p | 型 T* のポインタ |
| Expression | 定義 |
| rv | T 型の右辺値を示す式 |
| expr | std::allocator_traits<A>::construct(m, p, rv) |
T は、以下のすべての条件が満たされる場合、X へ MoveInsertable です。
- expr はwell-formed です。
exprの評価直後、exprの値は評価前のrvの値に相当します。
[edit] 注記
A が std::allocator<T> の場合、これは配置 new を呼び出します。これは ::new((void*)p) T(rv)(until C++20)std::construct_at(p, rv)(since C++20) によります。これは実質的に T が move constructible であることを要求します。
std::allocator<T> または類似のアロケータが使用される場合、クラスはムーブコンストラクタを実装する必要はありません。この型要件を満たすためには、const T& 引数を受け取るコピーコンストラクタは、右辺値式にバインドできます。MoveInsertable クラスがムーブコンストラクタを実装している場合、構築後の rv の値が未指定であることを利用するためにムーブセマンティクスを実装することもできます。
C++23までstd::basic_stringの要素を構築する際にはカスタムconstructが使用されることが要求されていましたが、すべての実装ではデフォルトのメカニズムしか使用されていませんでした。この要件は、既存の実践に合わせるためにP1072R10によって修正されました。
[edit] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2177 | C++11 | expr の評価には事後条件がありませんでした。 |
追加された |
[edit] 関連項目
| CopyInsertable |