Spec-Zone.ru › C++

std::ranges::iter_swap

Определено в заголовочном файле <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. Подробности см. в разделе Объект точки настройки.

Пример

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/ranges/iter_swap

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API