Namespaces
Variants

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

From cppreference.net
Utilities library
void swap ( variant & rhs ) noexcept ( /* ver más abajo */ ) ;
(desde C++17)
(constexpr desde C++20)

Intercambia dos variant objetos.

  • Si tanto * this como rhs carecen de valor por excepción, no hace nada.
  • En caso contrario, si tanto * this como rhs contienen la misma alternativa, llama a swap ( * std:: get_if < i > ( this ) , * std:: get_if < i > ( std:: addressof ( rhs ) ) ) donde i es index() . Si se lanza una excepción, el estado de los valores depende de la seguridad de excepciones de la función swap llamada.
  • En caso contrario, intercambia los valores de rhs y * this . Si se lanza una excepción, el estado de * this y rhs depende de la seguridad de excepciones del constructor de movimiento del variant.

El programa está mal formado a menos que los tipos T_i sean Swappable y std:: is_move_constructible_v < T_i > sea true para todos los T_i en Types... .

Contenidos

Parámetros

rhs - un objeto variant para intercambiar con

Valor de retorno

(ninguno)

Excepciones

Si this - > index ( ) == rhs. index ( ) , puede lanzar cualquier excepción lanzada por swap ( * std:: get_if < i > ( this ) , * std:: get_if < i > ( std:: addressof ( rhs ) ) ) con i siendo index() .

De lo contrario, puede lanzar cualquier excepción lanzada por los constructores de movimiento de las alternativas actualmente contenidas en * this y rhs .

noexcept especificación:
noexcept ( ( ( std:: is_nothrow_move_constructible_v < Types > &&
std:: is_nothrow_swappable_v < Types > ) && ... ) )

Notas

Macro de prueba de características Valor Std Característica
__cpp_lib_variant 202106L (C++20)
(DR)
Completamente constexpr std::variant

Ejemplo

#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);
}

Salida:

2 abc
abc 2

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
P2231R1 C++20 swap no era constexpr mientras que los destructores no triviales pueden ser constexpr en C++20 hecho constexpr

Véase también

especializa el algoritmo std::swap
(plantilla de función)