std::optional<T>:: swap
|
void
swap
(
optional
&
other
)
noexcept
(
/* ver más abajo */
)
;
|
(desde C++17)
(constexpr desde C++20) |
|
Intercambia el contenido con el de other .
- Si ni * this ni other contienen un valor, la función no tiene efecto.
-
Si solo uno de
*
this
y
other
contiene un valor (llamemos a este objeto
iny al otroun), el valor contenido deunes inicializado directamente desde std :: move ( * in ) , seguido por la destrucción del valor contenido deincomo si fuera por in - > T :: ~T ( ) . Después de esta llamada,inno contiene un valor;uncontiene un valor.
- Si tanto * this como other contienen valores, los valores contenidos se intercambian llamando a using std:: swap ; swap ( ** this, * other ) .
El programa está mal formado a menos que el tipo
T
sea
Swappable
y
std::
is_move_constructible_v
<
T
>
sea
true
.
Contenidos |
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 |
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) |