Namespaces
Variants

std::experimental::ranges:: Assignable

From cppreference.net
ヘッダーで定義 <experimental/ranges/concepts>
template < class T, class U >

concept bool Assignable =
std:: is_lvalue_reference < T > :: value &&
CommonReference <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & > &&
requires ( T t, U && u ) {
{ t = std:: forward < U > ( u ) } - > Same < T > && ;

} ;
(ranges TS)

Assignable<T, U> コンセプトは、 U で指定される型および値カテゴリの式が、 T で指定される型の左辺値式に代入可能であることを指定します。

与えられた

  • t 、型 std:: remove_reference_t < T > の左辺値であり、オブジェクト o を参照するもの、
  • u decltype ( ( u ) ) U となる式、
  • u2 u と等価な別個のオブジェクト、

Assignable<T, U> は以下の場合にのみ満たされます

  • std:: addressof ( t = u ) == std:: addressof ( o ) (すなわち、代入式は左オペランドを参照する左辺値を返す);
  • t = u の評価後:
    • t u2 と等しい。ただし u o を参照する非const xvalueである場合(すなわち自己ムーブ代入の場合)を除く;
    • u がglvalueの場合:
      • 非const xvalueの場合、それが参照するオブジェクトは有効だが未規定の状態となる;
      • それ以外の場合、参照先オブジェクトは変更されない;

Assignable<T, U> std:: is_lvalue_reference < T > :: value の間に包含関係が存在する必要はありません。

等価性保存

式は、等しい入力が与えられた場合に等しい出力をもたらす場合、 equality preserving である。

  • 式への入力は、そのオペランドで構成されます。
  • 式からの出力は、その結果と、式によって変更されたすべてのオペランド(存在する場合)で構成されます。

等価性を保持することが要求されるすべての式は、さらに stable(安定性) が要求されます:同じ入力オブジェクトに対するそのような式の2回の評価は、それらの入力オブジェクトに対する明示的な変更がない限り、等しい出力を持たなければなりません。

特に明記されていない限り、 requires式 で使用される各式は、等価性を保存し安定していることが要求され、式の評価は非定数オペランドのみを変更できます。定数オペランドは変更してはなりません。

注記

形式 { expression } - > Same < T > && の導出制約は、実質的に decltype ( ( expression ) ) && T&& と完全に同じ型であることを要求します。これは式の型とその値カテゴリの両方を制約します。

代入は全関数である必要はありません。特に、何らかのオブジェクト x への代入が他のオブジェクト y の変更を引き起こす可能性がある場合、 x = y = の定義域に含まれない可能性が高いです。これは通常、右オペランドが左オペランドによって直接的または間接的に所有されている場合に発生します(例:ノードベースのデータ構造におけるスマートポインタ、または std:: vector < std:: any > のようなもの)。