std::ranges::swap
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <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 */); |
||
t と u の参照先の値を交換します。
ranges::swap の呼び出しは以下と expression-equivalent です。
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の宣言。
オーバーロード解決によって選択された関数が
t と u の参照先の値を交換しない場合は、プログラムは ill-formed です (診断は要求されません)。2) そうでなく、
T と U が同じエクステントを持つ配列型 (要素の型は異なっていても構いません) への左辺値参照であり、 ranges::swap(*t, *u) が有効な式であれば、 (void)ranges::swap_ranges(t, u)。3) そうでなく、
T と U がどちらも std::move_constructible<V> および std::assignable_from<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(t, u) が現れたときは置換失敗になります。expression-equivalent
式 e と式 f が同じ効果を持ち、どちらも潜在的に例外を投げるかどちらも潜在的に例外を投げない (すなわち noexcept(e) == noexcept(f)) であり、どちらも定数部分式であるかどちらも定数部分式でない場合、 e は f と expression-equivalent です。
カスタマイゼーションポイントオブジェクト
名前 ranges::swap はカスタマイゼーションポイントオブジェクトを表します。 これは semiregular なリテラルクラス型 (以下 swap_ftor(説明専用)) の const な関数オブジェクトです。 swap_ftor のすべてのインスタンスは等しいです。 すなわち、 ranges::swap は自由にコピーでき、そのコピーはお互いに交換可能です。
型の集合 Args... が与えられたとき、 std::declval<Args>()... が上記の ranges::swap の引数に対する要件を満たすならば、 swap_ftor は std::invocable<const swap_ftor&, Args...> を満たします。 そうでなければ、 swap_ftor の関数呼び出し演算子はオーバーロード解決に参加しません。
例
| This section is incomplete Reason: no example |
関連項目
(C++20) |
型がスワップ可能であること、または2つの型がお互いにスワップ可能であることを指定します (コンセプト) |
| 2つのオブジェクトの値を入れ替えます (関数テンプレート) |