std::swap(std::variant)
Определено в заголовке <variant> | ||
|---|---|---|
template <class... Types>
void swap( std::variant<Types...>& lhs,
std::variant<Types...>& rhs ) noexcept(/* see below */); |
(с C++17) (до C++20) | |
template <class... Types>
constexpr void swap( std::variant<Types...>& lhs,
std::variant<Types...>& rhs ) noexcept(/* see below */);
| (с C++20) |
Перегружает алгоритм std::swap для std::variant. Эффективно вызывает lhs.swap(rhs).
Эта перегрузка участвует в разрешении перегрузки только если std::is_move_constructible_v<T_i> и std::is_swappable_v<T_i> являются true для всех T_i в Types...
Параметры
| lhs, rhs | - | объекты variant с значениями, которые нужно поменять местами |
Возвращаемое значение
(нет)
Исключения
noexcept спецификация: noexcept(noexcept(lhs.swap(rhs)))Пример
#include <variant>
#include <string>
#include <iostream>
auto print = [](auto const& v, char term = '\n') {
std::visit([](auto&& o) { std::cout << o; }, v);
std::cout << term;
};
int main()
{
std::variant<int, std::string> v1{123}, v2{"XYZ"};
print(v1, ' ');
print(v2);
std::swap(v1, v2);
print(v1, ' ');
print(v2);
std::variant<double, std::string> v3{3.14};
// std::swap(v1, v3); // ERROR: ~ inconsistent parameter packs
}Вывод:
123 XYZ XYZ 123
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам 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/swap2