Пространства имён
Варианты
Действия

std::variant<Types...>::swap

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
<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