Namespaces
Variants

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

From cppreference.net
Utilities library
void swap ( variant & rhs ) noexcept ( /* см. ниже */ ) ;
(начиная с C++17)
(constexpr начиная с 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
(шаблон функции)