Namespaces
Variants

std::ranges:: iter_swap

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
Определено в заголовке <iterator>
namespace ranges {

inline namespace /* unspecified */ {
inline constexpr /* unspecified */
iter_swap = /* unspecified */ ;
}

}
(начиная с C++20)
(объект точки кастомизации)
Сигнатура вызова
template < class I1, class I2 >
constexpr void iter_swap ( I1 && i1, I2 && i2 ) noexcept ( /* see below */ ) ;
(начиная с C++20)
Вспомогательная функция
template < class X, class Y >

constexpr std:: iter_value_t < X >
iter - exchange - move ( X && x, Y && y )
noexcept ( noexcept ( std:: iter_value_t < X > ( std :: ranges:: iter_move ( x ) ) ) &&

noexcept ( * x = std :: ranges:: iter_move ( y ) ) ) ;
( только для демонстрации* )

Обменивает значения, обозначенные двумя итераторами.

Эффект вспомогательной функции только для экспозиции iter-exchange-move эквивалентен

std::iter_value_t<X> old(std::ranges::iter_move(x));
*x = std::ranges::iter_move(y);
return old;

ranges :: iter_swap ( i1, i2 ) является эквивалентным по выражению следующему:

  1. ( void ) iter_swap ( i1, i2 ) , если i1 или i2 имеет тип класса или перечисления и выражение корректно сформировано, где разрешение перегрузки для iter_swap выполняется с дополнительным кандидатом void iter_swap ( auto , auto ) = delete ; [1] , исключая саму std::ranges::iter_swap .
    • Если выбранная перегрузка не обменивает значения, обозначенные i1 и i2 , программа некорректна, диагностика не требуется.
  2. В противном случае, ranges:: swap ( * i1, * i2 ) , если оба I1 и I2 моделируют indirectly_readable и если std:: iter_reference_t < I1 > и std:: iter_reference_t < I2 > моделируют swappable_with .
  3. В противном случае, ( void ) ( * i1 = iter-exchange-move ( i2, i1 ) ) , если std:: indirectly_movable_storable < I1, I2 > и std:: indirectly_movable_storable < I2, I1 > оба удовлетворены, за исключением того, что i1 вычисляется только один раз.
  4. В противном случае, ranges :: iter_swap ( i1, i2 ) является некорректной, что может привести к ошибке подстановки , когда ranges :: iter_swap ( i1, i2 ) появляется в непосредственном контексте инстанцирования шаблона.
  1. Это исключает вызов неограниченного std::iter_swap .

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

Имя ranges::iter_swap обозначает объект точки кастомизации , который является константным функциональным объектом типа литерального semiregular класса. Для подробностей см. CustomizationPointObject .

Пример

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

(C++20)
обменивает объекты, на которые указывают два скорректированных базовых итератора
(function template)
(C++20)
обменивает объекты, на которые указывают два базовых итератора
(function template)
обменивает элементы, на которые указывают два итератора
(function template)