std::ranges::iter_swap
来自 cppreference.cn
< cpp | 迭代器 (iterator)
定义于头文件 <iterator> |
||
namespace ranges { inline namespace /* 未指定 */ { |
(C++20 起) (定制点对象) |
|
调用签名 (Call signature) |
||
template< class I1, class I2 > constexpr void iter_swap( I1&& i1, I2&& i2 ) noexcept(/* 见下文 */); |
(C++20 起) | |
辅助函数 |
||
template< class X, class Y > constexpr std::iter_value_t<X> |
(仅作说明*) | |
交换两个迭代器所表示的值。
仅用于说明的辅助函数 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 所表示的值,则程序格式错误,无需诊断。
- 否则,如果
I1
和I2
都满足indirectly_readable
且 std::iter_reference_t<I1> 和 std::iter_reference_t<I2> 满足swappable_with
,则为 ranges::swap(*i1, *i2)。 - 否则,如果 std::indirectly_movable_storable<I1, I2> 和 std::indirectly_movable_storable<I2, I1> 都满足,则为 (void)(*i1 =
iter-exchange-move
(i2, i1)),但 i1 仅评估一次。 - 否则,ranges::iter_swap(i1, i2) 格式错误,这可能导致当 ranges::iter_swap(i1, i2) 出现在模板实例化的直接上下文中时发生替换失败。
- ↑ 这排除了调用无约束的 std::iter_swap。
自定义点对象
名称 ranges::iter_swap
表示一个 *定制点对象*,它是一个 函数对象,属于 字面量 semiregular
类类型的 const 实例。出于说明目的,其类型的不带 cv 限定符的版本表示为 __iter_swap_fn
。
__iter_swap_fn
的所有实例都相等。在相同参数上调用不同类型的 __iter_swap_fn
实例的效果是等价的,无论表示实例的表达式是左值还是右值,以及是否带有 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) |
交换两个底层迭代器指向的对象 (函数模板) |
交换两个迭代器所指向的元素 (函数模板) |