名前空間
変種
操作

std::ranges::swap

提供: cppreference.com
< cpp‎ | utility
 
 
 
ヘッダ <concepts> で定義
inline namespace /* unspecified */ {

    inline constexpr /* unspecified */ swap = /* unspecified */;

}
(C++20以上)
(カスタマイゼーションポイントオブジェクト)
呼び出しのシグネチャ
template< class T, class U >

    requires /* see below */

constexpr void swap(T&& t, U&& u) noexcept(/* see below */);

tu の参照先の値を交換します。

ranges::swap の呼び出しは以下と同等です。

1) 以下の候補を用いてオーバーロード解決を行なった場合に、 (void)swap(std::forward<T>(t), std::forward<U>(u)) が有効な式であれば、その式。
  • template<class T> void swap(T&, T&) = delete;
  • template<class T, std::size_t N> void swap(T(&)[N], T(&)[N]) = delete;
  • 実引数依存の名前探索によって発見されたあらゆる swap の宣言。
オーバーロード解決によって選択された関数が tu の参照先の値を交換しない場合は、プログラムは ill-formed です (診断は要求されません)。
2) そうでなく、 TU が同じエクステントを持つ配列型 (要素の型は異なっていても構いません) への左辺値参照であり、 ranges::swap(*t, *u) が有効な式であれば、 (void)ranges::swap_ranges(t, u)
3) そうでなく、 TU がどちらも MoveConstructible<V> および Assignable<V&, V> の構文的な要件を満たす何らかの型 V であれば、 V v{std::move(t)}; t = std::move(u); u = std::move(v); によって行われたかのように、参照先の値を交換します。 いずれかのコンセプトの意味的な要件が満たされない場合は、プログラムは ill-formed です (診断は要求されません)。
4) それ以外のすべての場合において、 ranges::swap の呼び出しは ill-formed です。

ranges::swap が呼ぶすべての関数 (上で規定されている通りの) が定数式で使用できるならば、 ranges::swap は定数式で使用できます。

目次

[編集] カスタマイゼーションポイントオブジェクト

名前 ranges::swapカスタマイゼーションポイントオブジェクトを表します。 これは Semiregularリテラルクラス型 (以下 SwapT(説明専用)) の関数オブジェクトです。 SwapT のすべてのインスタンスは等しいです。 すなわち、 ranges::swap は自由にコピーでき、そのコピーはお互いに交換可能です。

型の集合 Args... が与えられたとき、 std::declval<Args>()... が上記の ranges::swap の引数に対する要件を満たすならば、 SwapTstd::Invocable<const SwapT&, Args...> を満たします。 そうでなければ、 SwapT の関数呼び出し演算子はオーバーロード解決に参加しません。

[編集] 例外

1)
noexcept 指定:  
noexcept(noexcept((void)swap(std::forward<T>(t), std::forward<T>(u))))
ただし swap は上で説明されている通りに発見されます。
2)
noexcept 指定:  
noexcept(noexcept(ranges::swap(*t, *u)))

[編集]

[編集] 関連項目

型がスワップ可能であること、または2つの型がお互いにスワップ可能であることを指定します
(コンセプト) [edit]
2つのオブジェクトの値を入れ替えます
(関数テンプレート) [edit]