std::variant<Types...>::swap
De cppreference.com
<tbody>
</tbody>
void swap( variant& rhs ) noexcept(/* véase más abajo */); |
(1) | (desde C++17) |
Intercambia dos objetos variantes.
- Si tanto
*thiscomorhsson sin valor debido a una excepción, no hace nada. - De lo contrario, si tanto
*thiscomorhsmantienen la misma alternativa, llamadas aswap(std::get<i>(*this), std:get<i>(rhs))dondeiesindex(). 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
rhsy*this. Si se lanza una excepción, el estado de*thisyrhsdepende 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...
Parámetros
| rhs | - | Un objeto variante con el cual intercambiar. |
Valor de retorno
(Ninguno)
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)
<tbody>
</tbody>
noexcept(((std::is_nothrow_move_constructible_v<Types> && std::is_nothrow_swappable_v<Types>) && ...)) |
||
Ejemplo
Ejecuta este código
#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