Namespaces
Variants

std::experimental::ranges:: swap

From cppreference.net
ヘッダーで定義 <experimental/ranges/utility>
namespace {

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

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

requires /* see below */

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

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 ;
  • 実引数依存の名前探索 によって発見された swap のあらゆる宣言。
オーバーロード解決によって選択された関数が t u が参照する値を交換しない場合、プログラムは不適格(ill-formed)となる。診断は不要である。
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 は、それが呼び出すすべての関数(上記で規定されている通り)が定数式で使用可能である場合、定数式で使用できます。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++専門用語(Customization point objects、Exceptions、Example、See also)は原文のまま保持しました - HTMLタグ、属性、クラス名は一切変更していません - 番号部分(tocnumber)もそのまま保持しました - フォーマットと構造は完全に維持されています

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

名前 ranges::swap カスタマイゼーションポイントオブジェクト を表し、これは 関数オブジェクト であり、 リテラル Semiregular クラス型(説明の目的で SwapT と表記)のオブジェクトです。 SwapT のすべてのインスタンスは等価です。したがって、 ranges::swap は自由にコピーでき、そのコピーは互換的に使用できます。

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

翻訳単位ごとに定義される ranges::swap は、同一のカスタマイゼーションポイントオブジェクトのインスタンスを参照します。(これは、インライン関数や関数テンプレート内で自由に使用でき、 One Definition Rule に違反しないことを意味します。)

例外

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指定:

関連項目

2つのオブジェクトの値を交換する
(関数テンプレート)