命名空间
变体
操作

std::ranges::iter_swap

来自 cppreference.cn
 
 
迭代器库
迭代器概念
迭代器原语
算法概念与工具
间接可调用概念
常用算法要求
工具
迭代器适配器
迭代器定制点
ranges::iter_swap
(C++20)
 
定义于头文件 <iterator>
namespace ranges {

    inline namespace /* 未指定 */ {
        inline constexpr /* 未指定 */
            iter_swap = /* 未指定 */;
    }

}
(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( 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),如果 i1i2 具有类或枚举类型且表达式格式良好,其中 iter_swap重载决议使用附加候选 void iter_swap(auto, auto) = delete;[1] 执行,不包括 std::ranges::iter_swap 本身。
    • 如果选定的重载未交换 i1i2 所表示的值,则程序格式错误,无需诊断。
  2. 否则,如果 I1I2 都满足 indirectly_readablestd::iter_reference_t<I1>std::iter_reference_t<I2> 满足 swappable_with,则为 ranges::swap(*i1, *i2)
  3. 否则,如果 std::indirectly_movable_storable<I1, I2>std::indirectly_movable_storable<I2, I1> 都满足,则为 (void)(*i1 = iter-exchange-move(i2, i1)),但 i1 仅评估一次。
  4. 否则,ranges::iter_swap(i1, i2) 格式错误,这可能导致当 ranges::iter_swap(i1, i2) 出现在模板实例化的直接上下文中时发生替换失败
  1. 这排除了调用无约束的 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 满足模型

否则,__iter_swap_fn 的函数调用操作符不参与重载决议。

[编辑] 示例

[编辑] 另请参阅

(C++20)
交换两个调整后的底层迭代器指向的对象
(函数模板) [编辑]
(C++20)
交换两个底层迭代器指向的对象
(函数模板) [编辑]
交换两个迭代器所指向的元素
(函数模板) [编辑]