std::variant<Types...>:: swap
|
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ónswapllamada. - 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 .
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
|
(C++17)
|
especializa el algoritmo
std::swap
(plantilla de función) |