Namespaces
Variants

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

From ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы проверки возможностей библиотеки (C++20)
Программные утилиты
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношения (deprecated in C++20)
Функции сравнения целых чисел
(C++20)(C++20)(C++20)    
(C++20)
swap и операции с типами
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Распространённые типы-словари
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
void swap( variant& rhs ) noexcept(/* see below */);
(since C++17)
(constexpr since 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 не является 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 > ) && ... ) )

Примечания

Макрос тестирования возможностей Значение Стандарт Функция
__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 Applied to Behavior as published Correct behavior
P2231R1 C++20 swap не был constexpr в то время как нетривиальные деструкторы могут быть constexpr в C++20 сделан constexpr

Смотрите также

специализирует алгоритм std::swap
(шаблон функции)