std::variant<Types...>::swap
void swap( variant& rhs ) noexcept(/* see below */);
|
(C++17以降) (C++20からconstexpr) |
|
2つの variant オブジェクトを入れ替える。
- もし
*thisとrhsの両方が例外により値なしの場合、何もしない。 - そうでなく、もし
*thisとrhsの両方が同じ代わり値を保持している場合、swap(*std::get_if<i>(this), *std::get_if<i>(std::addressof(rhs)))を呼び出す。ここでiはindex()である。例外が投げられた場合、値の状態は呼び出されたswap関数の例外安全性に依存する。 - そうでなければ、
rhsと*thisの値を交換する。例外が投げられた場合、*thisとrhsの状態は variant のムーブコンストラクタの例外安全性に依存する。
プログラムは、型 T_i が Swappable であり、かつ std::is_move_constructible_v<T_i> が true 内の全ての T_i に対して Types... である場合を除き、形式が不適格となる。
パラメータ
| rhs | - |
交換する
variant
オブジェクト
|
戻り値
(なし)
例外
this
-
>
index
(
)
==
rhs.
index
(
)
の場合、
swap
(
*
std::
get_if
<
i
>
(
this
)
,
*
std::
get_if
<
i
>
(
std::
addressof
(
rhs
)
)
)
によって送出されるあらゆる例外を送出する可能性があります。ここで
i
は
index()
です。
それ以外の場合、現在 * this と rhs が保持している代替オプションのムーブコンストラクタによってスローされるあらゆる例外をスローする可能性があります。
std:: is_nothrow_swappable_v < Types > ) && ... ) )
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_variant
|
202106L
|
(C++20)
(DR) |
完全な
constexpr
std::variant
|
例
#include <iostream> #include <string> #include <variant> int main() { std::variant<int, std::string> v1{2}, v2{"abc"}; std::visit([](auto&& x) { std::cout << x << ' '; }, v1); std::visit([](auto&& x) { std::cout << x << '\n'; }, v2); v1.swap(v2); std::visit([](auto&& x) { std::cout << x << ' '; }, v1); std::visit([](auto&& x) { std::cout << x << '\n'; }, v2); }
出力:
2 abc abc 2
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| P2231R1 | C++20 |
swap
は
constexpr
ではなかったが、C++20では非自明なデストラクタが
constexpr
になり得る
|
constexpr 化された |
関連項目
|
(C++17)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |