Namespaces
Variants

std::experimental::ranges:: Swappable, std::experimental::ranges:: SwappableWith

From cppreference.net
template < class T >

concept bool Swappable =
requires ( T & a, T & b ) {
ranges:: swap ( a, b ) ;

} ;
(1) (ranges TS)
template < class T, class U >

concept bool SwappableWith =
CommonReference <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & > &&
requires ( T && t, U && u ) {
ranges:: swap ( std:: forward < T > ( t ) , std:: forward < T > ( t ) ) ;
ranges:: swap ( std:: forward < U > ( u ) , std:: forward < U > ( u ) ) ;
ranges:: swap ( std:: forward < T > ( t ) , std:: forward < U > ( u ) ) ;
ranges:: swap ( std:: forward < U > ( u ) , std:: forward < T > ( t ) ) ;

} ;
(2) (ranges TS)

概念 Swappable<T> 规定了类型 T 的左值是可交换的。

概念 SwappableWith<T, U> 规定了由 T U 编码的类型及值类别表达式可相互交换。仅当调用 ranges:: swap ( t, u ) 能交换 t u 的值时, SwappableWith<T, U> 才被满足。具体而言,若存在分别等于 t u 的独立对象 t2 u2 ,在求值 ranges:: swap ( t, u ) ranges:: swap ( u, t ) 后, t2 应等于 u u2 应等于 t

等值保持性

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

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

每个要求保持相等性的表达式还必须满足 稳定性 要求:对此类表达式进行两次求值时,若输入对象相同且期间未对这些输入对象进行显式修改,则必须产生相等的输出结果。

除非另有说明,在 要求表达式 中使用的每个表达式都必须保持相等性且稳定,且表达式求值仅可修改其非常量操作数。常量操作数不得被修改。