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) является выражением-эквивалентным:
-
(void)iter_swap(i1, i2), еслиi1илиi2имеют тип класса или перечисления и выражение корректно, где разрешение перегрузкиiter_swapвыполняется с дополнительным кандидатомvoid iter_swap(auto, auto) = delete;[1], исключаяstd::ranges::iter_swapсамо по себе.- Если выбранная перегрузка не меняет значение, обозначаемое
i1иi2, программа некорректна, диагностика не требуется.
- Если выбранная перегрузка не меняет значение, обозначаемое
- В противном случае,
ranges::swap(*i1, *i2)если обаI1иI2моделируютindirectly_readableи если std::iter_reference_t<I1> и std::iter_reference_t<I2> моделируютswappable_with. - В противном случае,
(void)(*i1 = iter-exchange-move(i2, i1)), еслиstd::indirectly_movable_storable<I1, I2>иstd::indirectly_movable_storable<I2, I1>оба моделируют, за исключением того, чтоi1вычисляется только один раз. - В противном случае,
ranges::iter_swap(i1, i2)некорректно, что может привести к неудаче подстановки при появленииranges::iter_swap(i1, i2)в непосредственном контексте создания шаблона.
- Это исключает вызов неограниченного
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 не участвует в разрешении перегрузки.
Пример
См. также
|
(C++20) | меняет местами объекты, на которые указывают два скорректированных базовых итератора (шаблон функции) |
|
(C++20) | меняет местами объекты, на которые указывают два базовых итератора (шаблон функции) |
| меняет местами элементы, на которые указывают два итератора (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/ranges/iter_swap