C++ named requirements: MoveInsertable (since C++11)
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
指定された型のオブジェクトが、与えられたアロケータによってその型の右辺値から未初期化ストレージ内に構築可能であることを指定します。
目次 |
要件
以下の型、値、および式が与えられた場合:
| 型 | 定義 |
T
|
オブジェクト型 |
A
|
アロケータ型 |
X
|
以下の全ての条件を満たすコンテナ型:
|
| 値 | 定義 |
| m |
型
A
の左辺値
|
| p |
型
T*
のポインタ
|
| 式 | 定義 |
| rv |
型
T
の右辺値を表す式
|
| expr | std:: allocator_traits < A > :: construct ( m, p, rv ) |
T
は、以下の条件がすべて満たされる場合、
MoveInsertable
である:
- expr が適正な形式である。
- expr の評価直後、 * p の値は評価前の rv の値と等価である。
注記
A
が
std::
allocator
<
T
>
の場合、これはplacement
new
を呼び出します。具体的には
::
new
(
(
void
*
)
p
)
T
(
rv
)
(C++20まで)
std::
construct_at
(
p, rv
)
(C++20以降)
によって行われます。これは事実上、
T
がmove constructibleであることを要求します。
std::
allocator
<
T
>
または類似のアロケータが使用される場合、クラスはこの型要件を満たすために
move constructor
を実装する必要はありません:
copy constructor
が
const
T
&
引数を取る場合、右辺値式を束縛できます。
MoveInsertable
クラスがmove constructorを実装する場合、
move semantics
も実装して、構築後の
rv
の値が未規定であるという事実を活用することができます。
C++23までは
construct
が
std::basic_string
の要素構築時に使用されることが要求されていましたが、すべての実装はデフォルトのメカニズムのみを使用していました。この要求は既存の実装に合わせて
P1072R10
によって修正されました。
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2177 | C++11 | evaluting expr には事後条件がなかった | 追加された |
関連項目
| CopyInsertable |