Namespaces
Variants

C++ named requirements: MoveInsertable (since C++11)

From ja.cppreference.net
C++ named requirements

指定された型のオブジェクトが、与えられたアロケータによってその型の右辺値から未初期化ストレージ内に構築可能であることを指定します。

目次

要件

以下の型、値、および式が与えられた場合:

型 定義
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
注記:この翻訳では以下のルールに従っています: - HTMLタグと属性は翻訳せず保持 - ``タグ内のテキストはC++固有の用語「CopyInsertable」であるため翻訳せず保持 - 元の書式と構造を完全に維持