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 でエンコードされた型と値カテゴリの式が 互いに交換可能であることを指定します。 swappable_with<T, U> は、 ranges:: swap ( t, u ) の呼び出しによって t u の値が交換される場合にのみ満たされます。 つまり、 t と等しい別個のオブジェクト t2 u と等しい別個のオブジェクト u2 が与えられたとき、 ranges:: swap ( t, u ) または ranges:: swap ( u, t ) のいずれかを評価した後、 t2 u と等しく、 u2 t と等しくなります。

等価性保存

標準ライブラリコンセプトの requires expressions で宣言される式は、 equality-preserving であることが要求されます(特に明記されている場合を除く)。

参考文献

  • C++23標準 (ISO/IEC 14882:2024):
  • 18.4.9 コンセプト swappable [concept.swappable]
  • C++20標準 (ISO/IEC 14882:2020):
  • 18.4.9 コンセプト swappable [concept.swappable]