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> специфицирует, что lvalue типа T являются swappable.

Концепт swappable_with<T, U> определяет, что выражения типа и категории значения, закодированные в T и U , могут быть обменены друг с другом. swappable_with<T, U> выполняется только если вызов ranges:: swap ( t, u ) обменивает значения t и u , то есть, при наличии различных объектов t2 , равных t , и u2 , равных u , после вычисления либо ranges:: swap ( t, u ) , либо ranges:: swap ( u, t ) , t2 становится равным u , а u2 становится равным t .

Сохранение равенства

Выражения, объявленные в requires выражениях концепций стандартной библиотеки, должны быть 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]