Namespaces
Variants

std::experimental::ranges:: swap

From cppreference.net
Определено в заголовке <experimental/ranges/utility>
namespace {

constexpr /* unspecified */ swap = /* unspecified */ ;

}
(ranges TS)
(объект точки кастомизации)
Сигнатура вызова
template < class T, class U >

requires /* see below */

void swap ( T && t, U && u ) noexcept ( /* see below */ ) ;

Обменивает значения, на которые ссылаются t и u .

Вызов ranges::swap эквивалентен:

1) ( void ) swap ( std:: forward < T > ( t ) , std:: forward < U > ( u ) ) , если это выражение допустимо, при этом разрешение перегрузки выполняется со следующими кандидатами:
Если функция, выбранная в результате разрешения перегрузки, не обменивает значения, на которые ссылаются t и u , программа является некорректной; диагностика не требуется.
2) В противном случае, ( void ) ranges:: swap_ranges ( t, u ) , если T и U являются lvalue-ссылками на массивы одинаковой длины (но, возможно, с разными типами элементов) и ranges:: swap ( * t, * u ) является допустимым выражением.
3) В противном случае, если T и U оба являются V& для некоторого типа V , который удовлетворяет синтаксическим требованиям MoveConstructible < V > и Assignable < V & , V > , обменивается значениями по ссылкам как если бы с помощью V v { std :: move ( t ) } ; t = std :: move ( u ) ; u = std :: move ( v ) ; . Если семантические требования любого из концептов не выполняются, программа является некорректной; диагностика не требуется.
4) Во всех остальных случаях вызов ranges::swap является некорректным.

ranges:: swap может использоваться в константных выражениях, если каждая вызываемая им функция (как указано выше) может быть так использована.

Содержание

Объекты точек кастомизации

Имя ranges::swap обозначает объект точки кастомизации , который является функциональным объектом типа литерального Semiregular класса (обозначаемого, для целей демонстрации, как SwapT ). Все экземпляры SwapT равны. Таким образом, ranges::swap может свободно копироваться, и его копии могут использоваться взаимозаменяемо.

Для заданного набора типов Args... , если std:: declval < Args > ( ) ... удовлетворяют требованиям к аргументам для ranges::swap выше, SwapT будет удовлетворять ranges :: Invocable < const SwapT, Args... > . В противном случае ни один оператор вызова функции SwapT не участвует в разрешении перегрузки.

В каждой единице трансляции, где определен ranges::swap , он ссылается на один и тот же экземпляр объекта точки кастомизации. (Это означает, что его можно свободно использовать в таких конструкциях, как встроенные функции и шаблоны функций без нарушения правила одного определения .)

Исключения

1)
noexcept спецификация:
noexcept ( noexcept ( ( void ) swap ( std:: forward < T > ( t ) , std:: forward < T > ( u ) ) ) )
, где swap находится, как описано выше.
2)
noexcept спецификация:
noexcept ( noexcept ( ranges:: swap ( * t, * u ) ) )
3)
noexcept спецификация:

Пример

Смотрите также

обменивает значения двух объектов
(шаблон функции)