std::swap(std::variant)
Материал из cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev ">
</tbody><tbody>
</tbody>
| Определено в заголовочном файле <variant>
|
||
template <class... Types> void swap( std::variant<Types...>& lhs, std::variant<Types...>& rhs ) noexcept(/* смотрите ниже */); |
(начиная с C++17) (до C++20) |
|
template <class... Types> constexpr void swap( std::variant<Types...>& lhs, std::variant<Types...>& rhs ) noexcept(/* смотрите ниже */); |
(начиная с 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); // ОШИБКА: ~ несовместимые пакеты параметров
}
Вывод:
123 XYZ
XYZ 123
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| WG не указан | C++20 | swap не была constexpr, в то время как необходимые операциимогут быть constexpr в C++20 |
сделана constexpr |
Смотрите также
| обменивает содержимое с другим variant (public функция-элемент) |