Namespaces
Variants

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

From 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」であるため翻訳せず保持 - 元の書式と構造を完全に維持