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 обозначает объект точки кастомизации, который является const функциональным объектом литерального литерального semiregular типа класса. Для целей иллюстрации, неквалифицированная версия его типа обозначается как __iter_swap_fn.

Все экземпляры __iter_swap_fn равны. Эффекты вызова разных экземпляров типа __iter_swap_fn с одними и теми же аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и квалифицировано ли оно как const или нет (однако, volatile-квалифицированный экземпляр не обязан быть вызываемым). Таким образом, ranges::iter_swap может быть свободно скопирован, и его копии могут быть использованы взаимозаменяемо.

Учитывая набор типов Args..., если std::declval<Args>()... удовлетворяют требованиям к аргументам для ranges::iter_swap выше, __iter_swap_fn моделирует

  • std::invocable<__iter_swap_fn, Args...>,
  • std::invocable<const __iter_swap_fn, Args...>,
  • std::invocable<__iter_swap_fn&, Args...>, и
  • std::invocable<const __iter_swap_fn&, Args...>.

В противном случае, ни один оператор вызова функции __iter_swap_fn не участвует в разрешении перегрузки.

Пример

См. также

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/w/cpp/iterator/ranges/iter_swap

Spec-Zone.ru

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