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 обозначает объект точки настройки, представляющий собой константный функциональный объект типа класса литерального semiregular. Подробности см. в разделе Объект точки настройки.
Пример
См. также
|
(C++20) | обменивает объекты, на которые указывают два скорректированных базовых итератора (шаблон функции) |
|
(C++20) | обменивает объекты, на которые указывают два базовых итератора (шаблон функции) |
| обменивает элементы, на которые указывают два итератора (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/ranges/iter_swap