std::variant<Types...>::swap
Материал из cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev ">
</tbody><tbody>
</tbody>
void swap( variant& rhs ) noexcept(/* смотрите ниже */); |
(начиная с C++17) (до C++20) |
|
constexpr void swap( variant& rhs ) noexcept(/* смотрите ниже */); |
(начиная с 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.
Поведение не определено, если lvalues типа 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 <variant>
#include <string>
#include <iostream>
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++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| WG не указан | C++20 | swap не была constexpr, в то время как необходимые операциимогут быть constexpr в C++20 |
сделана constexpr |