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