C++ 名前付き要件: CopyInsertable (C++11 以降)
From cppreference.com
指定されたアロケータによって、型 T のオブジェクトをインプレースでコピー構築できることを示します。
[編集] 要件
以下の型、値、式が与えられた場合
| 型 | 定義 |
T
|
オブジェクト型 |
A
|
アロケータ型 |
X
|
以下のすべての条件を満たすコンテナ型
|
| 値 | 定義 |
| m | 型 A の左辺値 |
| p | 型 T* のポインタ |
| Expression | 定義 |
| v | T 型の lvalue、または const T 型の lvalue、あるいは const T 型の rvalue を示す式 |
| expr | std::allocator_traits<A>::construct(m, p, v) |
X に T が CopyInsertable であるとは、以下のすべての条件が満たされること。
-
TはXに MoveInsertable である。 - expr は well-formed (正しく形成されている) である。
exprの評価はvの値を変更しない。exprの評価の直後、vの値は *p と同等である。
[編集] ノート
A が std::allocator<T> の場合、これは配置 new を呼び出します。これは、::new((void*)p) T(v)(C++20 まで)std::construct_at(p, v)(C++20 以降) に相当します。
C++23までstd::basic_stringの要素を構築する際にはカスタムconstructが使用されることが要求されていましたが、すべての実装ではデフォルトのメカニズムしか使用されていませんでした。この要件は、既存の実践に合わせるためにP1072R10によって修正されました。
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2177 | C++11 | expr の評価には後条件がなかった。 |
追加された |
| LWG 3957 | C++11 | v は T 型の rvalue を示すことができる。 |
除外された |