std::optional<T>::swap
void swap( optional& other ) noexcept(/* see below */);
|
(desde C++17) (constexpr desde C++20) |
|
Intercambia el contenido con el de other.
- Si ni
*thisniothercontienen un valor, la función no tiene efecto.
- Si solo uno de
*thisyothercontiene un valor (llamemos a este objetoiny al otroun), el valor contenido deunse inicializa directo desdestd::move(*in), seguido de la destrucción del valor contenido deincomo si fuera porin->T::~T(). Después de esta llamada,inno contiene un valor;uncontiene un valor.
- Si ambos
*thisyothercontienen valores, los valores contenidos se intercambian llamando ausing std::swap; swap(**this, *other).
El programa está mal formado a menos que el tipo T sea Intercambiable y std::is_move_constructible_v<T> sea true.
Parámetros
| otro | - |
el objeto
optional
con el cual intercambiar contenidos
|
Valor de retorno
(ninguno)
Excepciones
std:: is_nothrow_swappable_v < T > )
En caso de una excepción lanzada, los estados de los valores contenidos de
*
this
y
other
están determinados por las garantías de seguridad de excepciones de
swap
del tipo
T
o del constructor de movimiento de
T
, según cuál sea llamado. Tanto para
*
this
como para
other
, si el objeto contenía un valor, permanece conteniendo un valor, y viceversa.
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_optional
|
202106L
|
(C++20)
(DR20) |
Completamente constexpr |
Notas
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_optional |
202106L |
(C++20) (DR20) |
Completamente constexpr
|
Ejemplo
#include <iostream> #include <optional> #include <string> int main() { std::optional<std::string> opt1("First example text"); std::optional<std::string> opt2("2nd text"); enum Swap { Before, After }; auto print_opts = [&](Swap e) { std::cout << (e == Before ? "Before swap:\n" : "After swap:\n"); std::cout << "opt1 contains '" << opt1.value_or("") << "'\n"; std::cout << "opt2 contains '" << opt2.value_or("") << "'\n"; std::cout << (e == Before ? "---SWAP---\n": "\n"); }; print_opts(Before); opt1.swap(opt2); print_opts(After); // Swap with only 1 set opt1 = "Lorem ipsum dolor sit amet, consectetur tincidunt."; opt2.reset(); print_opts(Before); opt1.swap(opt2); print_opts(After); }
Salida:
Before swap: opt1 contains 'First example text' opt2 contains '2nd text' ---SWAP--- After swap: opt1 contains '2nd text' opt2 contains 'First example text' Before swap: opt1 contains 'Lorem ipsum dolor sit amet, consectetur tincidunt.' opt2 contains '' ---SWAP--- After swap: opt1 contains '' opt2 contains 'Lorem ipsum dolor sit amet, consectetur tincidunt.'
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 las operaciones requeridas pueden ser
constexpr
en C++20
|
hecho constexpr |
Véase también
|
(C++17)
|
especializa el algoritmo
std::swap
(plantilla de función) |