std::variant<Types...>::swap
void swap( variant& rhs ) noexcept(/* see below */); |
(с C++17) (до C++20) | |
constexpr void swap( variant& rhs ) noexcept(/* see below */); | (с C++20) |
Меняет местами два 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.
noexcept спецификация: noexcept(((std::is_nothrow_move_constructible_v<Types> &&
std::is_nothrow_swappable_v<Types>) && ...))Пример
#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, хотя необходимые операции могут быть constexpr в C++20 | сделано constexpr |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/variant/swap