std::ranges::iter_swap
| ヘッダ <iterator> で定義 |
||
| namespace ranges { inline namespace /* 未指定 */ { |
(C++20以降) (カスタマイズポイントオブジェクト) |
|
| 呼び出しシグネチャ |
||
| 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> |
(説明用*) | |
2つのイテレータが指す値を交換します。
exposition-onlyヘルパー関数 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 がクラス型または列挙型を持ち、式が well-formed である場合。この場合、
iter_swapの オーバーロード解決 は、追加の候補 void iter_swap(auto, auto) = delete;[1] を伴って行われ、std::ranges::iter_swap自体は除外されます。- 選択されたオーバーロードが i1 と i2 が指す値を交換しない場合、プログラムは ill-formed であり、診断は不要です。
- それ以外の場合、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) は ill-formed となり、ranges::iter_swap(i1, i2) がテンプレートインスタンス化の直接のコンテキストに現れると SFINAE の結果となる可能性があります。
- ↑ これにより、制約のない std::iter_swap を呼び出すことができなくなります。
カスタマイゼーションポイントオブジェクト
ranges::iter_swap という名前は、関数オブジェクトであり、リテラルな semiregular クラス型の定数 customization point object を表します。説明のために、その型の cv-unqualified バージョンは __iter_swap_fn と表記されます。
__iter_swap_fn のすべてのインスタンスは等価です。同じ引数に対して呼び出される __iter_swap_fn の異なるインスタンスの効果は、インスタンスを表す式が lvalue であるか rvalue であるか、および 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) |
2つの調整された基礎となるイテレータが指すオブジェクトをスワップする (関数テンプレート) |
| (C++20) |
2つの基底イテレータが指すオブジェクトをスワップする (関数テンプレート) |
| 2つのイテレータが指す要素をスワップする (関数テンプレート) |