名前空間
変種
操作

std::experimental::ranges::Assignable

From cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
コンセプトライブラリ
中核言語のコンセプト
                              
オブジェクトのコンセプト
                              
                              
比較のコンセプト
呼び出し可能オブジェクトのコンセプト
                                        
                              
URNGコンセプト
 
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)

concept Assignable<T, U> は、U で指定された型と値カテゴリの式を、T で指定された型を持つ左辺値式に代入できることを指定します。

以下を考えます。

  • Tstd::remove_reference_t<T> 型の左辺値で、オブジェクト o を参照する t
  • decltype((u))U であるような式 u
  • u と等しい別のオブジェクト u2

Assignable<T, U> が満たされるのは、

  • std::addressof(t = u) == std::addressof(o)(つまり、代入式が左オペランドを参照する左辺値を生成すること)の場合のみです。
  • t = u を評価した後、
    • tu2 と等しくなります。ただし、uo を参照する非 const xvalue の場合(つまり、代入が自己移動代入の場合)は例外です。
    • u が glvalue の場合
      • 非 const xvalue である場合、それが参照するオブジェクトは有効ですが未指定の状態になります。
      • それ以外の場合、それが参照するオブジェクトは変更されません。

Assignable<T, U>std::is_lvalue_reference<T>::value の間に、被包含関係があるとは限りません。

[編集] 等価性保持

式が**等価性保持**であるとは、等しい入力に対して等しい出力を生成することを意味します。

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

等価性保持が要求されるすべての式は、さらに**安定**である必要があります。同じ入力オブジェクトでそのような式の2回の評価は、これらの入力オブジェクトの明示的な介入的な変更がない限り、等しい出力を持ちます。

特に断りがない限り、requires-expression で使用されるすべての式は、等価性を保持し、安定であることが要求され、式の評価は定数でないオペランドのみを変更できます。定数のオペランドは変更してはいけません。

[編集] Notes

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

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

English 日本語 中文(简体) 中文(繁體)