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 ) ;
} ;

/* 以上四个表达式均不要求保持相等性 */
(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 为右值,则其所指代对象的结果状态有效但未指定。

等值保持性

表达式若在给定相等输入时产生相等输出,则称其具有 等值保持性

  • 表达式的输入由其操作数构成。
  • 表达式的输出由其结果及所有被该表达式修改的操作数(如有)构成。

每个要求保持相等性的表达式还必须满足 稳定性 要求:对此类表达式的两次求值,若输入对象相同,则输出结果必须相等,除非其间显式修改了这些输入对象。

注释

唯一有效的 operator * 使用方式是在赋值表达式的左侧。通过同一可写类型值的赋值操作最多只能执行一次。

使用 const_cast 的必要表达式可防止具有纯右值 reference 类型的 Readable 对象意外满足 Writable 的语法要求,同时允许代理引用在其常量性为浅层时继续正常工作。详见 Ranges TS issue 381