Namespaces
Variants

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

De es.cppreference.net
 
 
Biblioteca de utilidades
Soporte del lenguaje
Soporte de tipos (tipos básicos, RTTI)
Macros de prueba de características de la biblioteca (C++20)
Utilidades de programa
Funciones variádicas
Soporte de corrutinas (C++20)
Soporte de contratos (C++26)
Comparación triple
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilidades generales
Operadores relacionales (obsoleto en C++20)
 
 
void swap( variant& rhs ) noexcept(/* see below */);
(desde C++17)
(constexpr desde C++20)

Intercambia dos objetos variant.

  • Si tanto *this como rhs están sin valor por excepción, no hace nada.
  • De lo contrario, si tanto *this como rhs tienen 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 ante excepciones de la función swap llamada.
  • De lo contrario, intercambia los valores de rhs y *this. Si se lanza una excepción, el estado de *this y rhs depende de la seguridad ante excepciones del constructor de movimiento de variant.

El programa está mal formado a menos que el tipo T_i sea Intercambiable y std::is_move_constructible_v<T_i> sea true para todo T_i en Types....

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)