Namespaces
Variants

std:: swappable, std:: swappable_with

From cppreference.net
定义于头文件 <concepts>
template < class T >

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

} ;
(1) (C++20 起)
template < class T, class U >

concept swappable_with =
std:: common_reference_with < 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) (C++20 起)

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

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

等值保持性

标准库概念的 requires 表达式 中声明的表达式必须满足 等值保持 要求(除非另有说明)。

参考文献

  • C++23 标准 (ISO/IEC 14882:2024):
  • 18.4.9 概念 swappable [concept.swappable]
  • C++20 标准 (ISO/IEC 14882:2020):
  • 18.4.9 概念 swappable [concept.swappable]