std::variant<Types...>::swap
From cppreference.com
void swap( variant& rhs ) noexcept(/* 後述 */); |
(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 であり、かつすべての T_i in Types... に対して 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 が現在保持している代替値のムーブコンストラクタによってスローされる可能性のある例外をスローする可能性があります。
noexcept 指定:
noexcept(((std::is_nothrow_move_constructible_v<Types> &&
std::is_nothrow_swappable_v<Types>) && ...))
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 | C++20 では非自明なデストラクタが constexpr になりうるのに対し、`swap` は constexpr ではありませんでした。 | constexprではありませんでした。 |
[編集] 関連項目
| (C++17) |
std::swap アルゴリズムを特殊化する (function template) |