名前空間
変種
操作

std::Assignable

提供: cppreference.com
< cpp‎ | concepts
ヘッダ <concepts> で定義
template< class LHS, class RHS >

concept Assignable =
  std::is_lvalue_reference_v<LHS> &&
  std::CommonReference<
    const std::remove_reference_t<LHS>&,
    const std::remove_reference_t<RHS>&> &&
  requires(LHS lhs, RHS&& rhs) {
    lhs = std::forward<RHS>(rhs);
    requires std::Same<decltype(lhs = std::forward<RHS>(rhs)), LHS>;

  };
(C++20以上)

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

  • decltype((lhs))LHS であるようなオブジェクト lcopy を参照する左辺値 lhs
  • decltype((rhs))RHS であるような式 rhs
  • rhs と等しい別のオブジェクト rcopy

が与えられたとき、以下の内容を満たす場合に限り、 Assignable<LHS, RHS> が満たされます。

  • std::addressof(lhs = rhs) == std::addressof(lcopy) (すなわち、代入式が左の被演算子を参照する左辺値を返す)
  • lhs = rhs の評価の後、
    • rhslcopy を参照する非 const な xvalue (すなわち自己ムーブ代入) でない限り、 lhsrcopy と等しくなる。
    • rhs が glvalue の場合、
      • それが非 const な xvalue であれば、その参照先のオブジェクトが有効だけれども未規定な状態になる。
      • そうでなければ、その参照先のオブジェクトは変更されない。

[編集] 等しさの維持

等しい入力を与えると等しい出力が得られる場合、その式は等しさを維持します。

  • 式への入力がその被演算子から構成される。
  • 式の出力がその結果およびその式によって変更されるすべての被演算子 (もしあれば) から構成される。

等しさを維持することが要求されるすべての式は、さらに安定であることも要求されます。 同じ入力オブジェクトを用いたそのような式の2回の評価は、間にそれらの入力オブジェクトの変更が明示的に挟まれなければ、等しい出力が得られなければなりません。

特に明記されない限り、 requires 式で使用されるすべての式は、等しさを維持することと安定であることが要求され、式の評価は非定数の被演算子のみを変更することができます。 定数である被演算子は変更してはなりません。

[編集] ノート

代入は全域写像である必要はありません。 特に、何らかのオブジェクト x への代入が何らかの別のオブジェクト y を変更することがある場合、 x = y はおそらく = の領域内にありません。 これは一般的には右の被演算子が直接的または間接的に左の被演算子によって所有されている (ノードベースのデータ構造におけるノードへのスマートポインタや std::vector<std::any> のような何かによって) 場合に発生します。

[編集] 関連項目

型が特定の引数に対する代入演算子を持っているかどうか調べます
(クラステンプレート) [edit]