名前空間
変種
操作

std::ranges::iter_swap

From cppreference.com
 
 
イテレータライブラリ
イテレータのコンセプト
イテレータのプリミティブ
アルゴリズムのコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
Rangeアクセス
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
ヘッダ <iterator> で定義
namespace ranges {

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

}
(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>
    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)));
(説明用*)

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)式同値 です。

  1. (void)iter_swap(i1, i2)、ただし i1 または i2 がクラス型または列挙型を持ち、式が well-formed である場合。この場合、iter_swapオーバーロード解決 は、追加の候補 void iter_swap(auto, auto) = delete;[1] を伴って行われ、std::ranges::iter_swap 自体は除外されます。
    • 選択されたオーバーロードが i1i2 が指す値を交換しない場合、プログラムは ill-formed であり、診断は不要です。
  2. それ以外の場合、ranges::swap(*i1, *i2)、ただし I1I2 の両方が indirectly_readable をモデルとし、かつ std::iter_reference_t<I1>std::iter_reference_t<I2>swappable_with をモデルとする場合。
  3. それ以外の場合、(void)(*i1 = iter-exchange-move(i2, i1))、ただし std::indirectly_movable_storable<I1, I2>std::indirectly_movable_storable<I2, I1> が両方ともモデルとされ、かつ i1 は一度だけ評価される場合。
  4. それ以外の場合、ranges::iter_swap(i1, i2) は ill-formed となり、ranges::iter_swap(i1, i2) がテンプレートインスタンス化の直接のコンテキストに現れると SFINAE の結果となる可能性があります。
  1. これにより、制約のない 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 は以下をモデルとします。

それ以外の場合、__iter_swap_fn の関数呼び出し演算子のいずれもオーバーロード解決に参加しません。

[編集]

[編集] 関連項目

(C++20)
2つの調整された基礎となるイテレータが指すオブジェクトをスワップする
(関数テンプレート) [編集]
(C++20)
2つの基底イテレータが指すオブジェクトをスワップする
(関数テンプレート) [編集]
2つのイテレータが指す要素をスワップする
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)