Namespaces
Variants

std::experimental::ranges:: Writable

From cppreference.net
template < class Out, class T >

concept bool Writable =
requires ( Out && o, T && t ) {
* o = std:: forward < T > ( t ) ;
* std:: forward < Out > ( o ) = std:: forward < T > ( t ) ;
const_cast < const ranges :: reference_t < Out > && > ( * o ) =
std:: forward < T > ( t ) ;
const_cast < const ranges :: reference_t < Out > && > ( * std:: forward < Out > ( o ) ) =
std:: forward < T > ( t ) ;
} ;

/* 上記4つの式のいずれも等価性を保持する必要はない */
(ranges TS)

Writable<Out, T> コンセプトは、 T によってエンコードされる型と値カテゴリを持つ値を、 イテレータ Out の参照先オブジェクトに書き込むための要件を定義します。

E decltype ( ( E ) ) T となる式とし、 o を型 Out のデリファレンス可能なオブジェクトとするとき、 Writable<Out, T> は以下の条件を満たす場合にのみ成立する:

  • Readable < Out > && Same < ranges :: value_type_t < Out > , std:: decay_t < T >> が満たされる場合、上記のいずれかの代入後の * o は代入前の E の値と等しくなります。

o は、上記の代入式のいずれかを評価した後、デリファレンス可能である必要はありません。 E がxvalueの場合、それが示すオブジェクトの結果の状態は有効ですが未指定です。

等価性保存

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

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

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

注記

有効な使用法は operator * を代入式の左辺に置く場合のみです。書き込み可能な型の同じ値を通じた代入は一度だけ行われる可能性があります。

const_cast を用いた必要な式は、prvalueの reference 型を持つ Readable オブジェクトが誤って Writable の構文要件を満たすことを防ぎつつ、プロキシ参照についてはそのconst性が浅い限り引き続き機能することを許可します。詳細は Ranges TS issue 381 を参照してください。