Espacios de nombres
Variantes
Acciones

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

De cppreference.com
< cpp‎ | utility‎ | variant
 
 
Biblioteca de servicios
 
 
void swap( variant& rhs ) noexcept(/* véase más abajo */);
(1) (desde C++17)

Intercambia dos objetos variantes.

  • Si tanto *this como rhs son sin valor debido a una excepción, no hace nada.
  • De lo contrario, si tanto *this como rhs mantienen la misma alternativa, llamadas a swap(std::get<i>(*this), std:get<i>(rhs)) donde i es index(). Si se lanza una excepción, el estado de los valores depende de la seguridad de excepción de la función de intercambio 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 de excepción del constructor de movimiento del variante.

El comportamiento está indefinido a menos que lvalues de tipo T_i sean Swappable y std::is_move_constructible_v<T_i> sea true para toda T_i en Types...

Contenido

[editar] Parámetros

rhs - Un objeto variante con el cual intercambiar.

[editar] Valor de retorno

(Ninguno)

[editar] Excepciones

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

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

Especificación noexcept:   (desde C++11)
noexcept(((std::is_nothrow_move_constructible_v<Types> &&
           std::is_nothrow_swappable_v<Types>) && ...))

[editar] Ejemplo

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

Salida:

2 abc
abc 2