std::experimental::ranges::swap
From cppreference.com
< cpp | experimental | ranges
| Defined in header <experimental/ranges/utility> |
||
| namespace { constexpr /* 未指定 */ swap = /* 未指定 */; |
(ranges TS) (カスタマイズポイントオブジェクト) |
|
| 呼び出しシグネチャ |
||
| template< class T, class U > requires /* 以下を参照 */ |
||
t と u が参照する値を交換します。
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;
- 引数依存名前探索 (ADL) によって見つかった
swapの宣言。
オーバーロード解決によって選択された関数が t と u が参照する値を交換しない場合、プログラムは不正形式となります。診断は必要ありません。
2) それ以外の場合、(void)ranges::swap_ranges(t, u)、ただし
T と U が同じエクステントを持つ配列型の左辺値参照 (要素型は異なる場合がある) であり、かつ ranges::swap(*t, *u) が有効な式である場合。3) それ以外の場合、
T と U が両方とも V& であり、かつ V が MoveConstructible<V> および Assignable<V&, V> の構文的要件を満たす場合、参照される値は V v{std::move(t)}; t = std::move(u); u = std::move(v); のように交換されます。いずれかのコンセプトの意味的要件が満たされていない場合、プログラムは不正形式となります。診断は必要ありません。4) 上記以外の場合、
ranges::swap の呼び出しは不正形式となります。ranges::swap は、上記で指定されたすべての関数が定数式内で呼び出し可能であれば、定数式で使用できます。
目次 |
[編集] カスタマイズポイントオブジェクト
ranges::swap という名前は、関数オブジェクトであり、リテラルな Semiregular クラス型 (説明のため SwapT と表記) のカスタマイズポイントオブジェクトを指します。SwapT のすべてのインスタンスは等価です。したがって、ranges::swap は自由にコピーでき、そのコピーは互換性があります。
型 Args... のセットが与えられた場合、std::declval<Args>()... が上記の ranges::swap の引数要件を満たす場合、SwapT は ranges::Invocable<const SwapT, Args...> を満たします。それ以外の場合、SwapT の関数呼び出し演算子はオーバーロード解決に参加しません。
ranges::swap が定義されているすべての翻訳単位において、カスタマイズポイントオブジェクトの同じインスタンスを参照します。 (これは、インライン関数や関数テンプレートなどで、単一定義規則に違反することなく自由に利用できることを意味します。)
[編集] 例外
1)
noexcept 指定:
ここで、noexcept(noexcept((void)swap(std::forward<T>(t), std::forward<T>(u))))
swap は上記のように見つかります。2)
noexcept 指定:
noexcept(noexcept(ranges::swap(*t, *u)))
3)
noexcept 指定:
noexcept(std::is_nothrow_move_constructible<V>::value &&
std::is_nothrow_move_assignable<V>::value)
std::is_nothrow_move_assignable<V>::value)
[編集] 例
| このセクションは未完成です 理由: 例がありません |
[編集] 関連項目
| 2つのオブジェクトの値を交換する (関数テンプレート) |