std::ranges::iter_swap
來自 cppreference.com
< 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) |
交換兩個底層迭代器指向的物件 (函式模板) |
交換兩個迭代器所指向的元素 (函式模板) |