名稱空間
變體
操作

std::ranges::iter_swap

來自 cppreference.com
 
 
迭代器庫
迭代器概念
迭代器原語
演算法概念與工具
間接可呼叫概念
常用演算法要求
工具
迭代器介面卡
迭代器定製點
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)
交換兩個底層迭代器指向的物件
(函式模板) [編輯]
交換兩個迭代器所指向的元素
(函式模板) [編輯]