std:: swap
|
定義先ヘッダ
<algorithm>
|
(C++11まで)
|
|
|
定義先ヘッダ
<utility>
|
(C++11以降)
|
|
|
定義先ヘッダ
<string_view>
|
||
|
template
<
class
T
>
void swap ( T & a, T & b ) ; |
(1) |
(C++11以降条件付きnoexcept)
(C++20以降constexpr) |
|
template
<
class
T2,
std::
size_t
N
>
void swap ( T2 ( & a ) [ N ] , T2 ( & b ) [ N ] ) ; |
(2) |
(C++11以降条件付きnoexcept)
(C++20以降constexpr) |
与えられた値を交換します。
|
このオーバーロードは、 std:: is_move_constructible_v < T > && std:: is_move_assignable_v < T > が true の場合にのみオーバーロード解決に参加する。 |
(C++17以降) |
|
このオーバーロードは、 std:: is_swappable_v < T2 > が true の場合にのみオーバーロード解決に参加する。 |
(C++17以降) |
目次 |
、
、
パラメータ
| a, b | - | 交換する値 |
| 型要件 | ||
-
T
は以下の要件を満たさなければならない:
CopyConstructible
および
CopyAssignable
(C++11以前)
MoveConstructible
および
MoveAssignable
(C++11以降)
。
|
||
-
T2
は
Swappable
の要件を満たさなければならない。
|
||
戻り値
(なし)
例外
|
(なし) |
(C++11まで) |
|
noexcept
仕様:
noexcept
(
std::
is_nothrow_move_constructible
<
T
>
::
value
&&
|
(C++11以降) |
|
noexcept
仕様:
例外仕様内での識別子
noexcept
(
noexcept
(
swap
(
*
a,
*
b
)
)
)
swap
の検索は、通常の検索規則で見つかるものに加えて、この関数テンプレートも見つけ、例外仕様をC++17の
std::is_nothrow_swappable
と同等にします。
|
(C++11以降)
(C++17まで) |
|
noexcept
仕様:
noexcept
(
std::
is_nothrow_swappable_v
<
T2
>
)
|
(C++17以降) |
計算量
特殊化
|
|
(C++20以前) |
プログラム定義型をスワップ可能にする標準的な方法は、その型と同じ名前空間で非メンバ関数swapを提供することです:詳細は Swappable を参照してください。
以下のオーバーロードは標準ライブラリによって既に提供されています:
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swapアルゴリズムを特殊化
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++20)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++23)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++14)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++17)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++17)
|
std::swap
アルゴリズムを特殊化
(関数) |
|
(C++17)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
(C++17)
|
std::swap
アルゴリズムを特殊化
(関数) |
|
(C++23)
|
std::swap
アルゴリズムを特殊化
(関数) |
|
(C++20)
|
std::swap
アルゴリズムを特殊化
(関数) |
|
(C++23)
|
std::swap
アルゴリズムを特殊化する
(関数) |
|
(C++20)
|
std::swap
アルゴリズムを特殊化
(関数) |
|
(C++20)
|
std::swap
アルゴリズムを特殊化
(関数) |
例
#include <algorithm> #include <iostream> namespace Ns { class A { int id {}; friend void swap(A& lhs, A& rhs) { std::cout << "swap(" << lhs << ", " << rhs << ")\n"; std::swap(lhs.id, rhs.id); } friend std::ostream& operator<<(std::ostream& os, A const& a) { return os << "A::id=" << a.id; } public: A(int i) : id {i} {} A(A const&) = delete; A& operator = (A const&) = delete; }; } int main() { int a = 5, b = 3; std::cout << a << ' ' << b << '\n'; std::swap(a, b); std::cout << a << ' ' << b << '\n'; Ns::A p {6}, q {9}; std::cout << p << ' ' << q << '\n'; // std::swap(p, q); // エラー、型要件が満たされない swap(p, q); // OK、ADLが適切なfriend `swap`を見つける std::cout << p << ' ' << q << '\n'; }
出力:
5 3 3 5 A::id=6 A::id=9 swap(A::id=6, A::id=9) A::id=9 A::id=6
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 227 | C++98 |
T
は
CopyConstructible
または
DefaultConstructible
であることが要求されていなかった
(型
T
の一時オブジェクトが構築できない可能性があった)
|
T
は
CopyConstructible であることも要求される |
| LWG 809 | C++98 | 配列をswapできなかった | オーバーロード (2) を追加 |
| LWG 2554 | C++11 |
多次元配列のswapは名前探索の問題により
常に noexcept にならなかった |
動作するように修正 |
関連項目
|
(C++20)
|
2つのオブジェクトの値を交換する
(カスタマイゼーションポイントオブジェクト) |
|
2つのイテレータが指す要素を交換する
(関数テンプレート) |
|
|
2つの範囲の要素を交換する
(関数テンプレート) |
|
|
(C++14)
|
引数を新しい値で置き換え、以前の値を返す
(関数テンプレート) |