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
について型
T_i
が
Swappable
であり、かつ
std::
is_move_constructible_v
<
T_i
>
が
true
である場合を除き、不適格です。
目次 |
パラメータ
| 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
アルゴリズムを特殊化する
(関数テンプレート) |