std::optional<T>::swap
De cppreference.com
void swap( optional& other ) noexcept(/* véase más abajo */); |
(desde C++17) | |
Intercambia el contenido con el de other
.
- Si ni *this ni
other
contienen un valor, esta función no tiene efecto.
- Si solo uno de *this y
other
contiene un valor (llamemos a este objetoin
y al otroun
), el valor contenido deun
es inicializado directamente desde std::move(*in), seguido por la destrucción del valor contenido dein
como si lo fuera por in->T::~T(). Después de esta llamada,in
no contiene un valor;un
contiene un valor.
- Si tanto *this como
other
contienen un valor, los valores contenidos se intercambian llamando a using std::swap; swap(**this, *other). Los lvaluesT
deben satisfacer a Swappable.
El programa está mal formado si std::is_move_constructible_v<T> es false.
Contenido |
[editar] Parámetros
other | - | El objeto optional con el cual intercambiar el contenido.
|
[editar] Valor de retorno
(Ninguno)
[editar] Excepciones
Especificación noexcept: (desde C++11)
noexcept(std::is_nothrow_move_constructible_v<T> && std::is_nothrow_swappable_v<T>) |
||
En el caso que se lance una excepción, los estados de los valores contenidos de *this y other
se determinan por las garantías de seguridad de swap
de tipo T
o el constructor de movimiento de T
, el que se haya llamado. Tanto para *this como para other
, si el objeto contenía un valor, se deja que contenga un valor y viceversa.
[editar] Ejemplo
Ejecuta este código
#include <iostream> #include <string> #include <optional> int main() { std::optional<std::string> opt1("Primer texto ejemplo"); std::optional<std::string> opt2("Segundo texto"); auto imprimir_opcionales = [&](const char* titulo) { std::cout << titulo << ":\n"; std::cout << "opt1 contiene '" << opt1.value_or("") << "'\n"; std::cout << "opt2 contiene '" << opt2.value_or("") << "'\n"; }; imprimir_opcionales("Antes del intercambio"); std::cout << "---INTERCAMBIO---\n"; opt1.swap(opt2); imprimir_opcionales("Después del intercambio"); std::cout << '\n'; // Intercambiar con solo un conjunto opt1 = "Lorem ipsum dolor sit amet, consectetur tincidunt."; opt2.reset(); imprimir_opcionales("Antes del intercambio"); std::cout << "---INTERCAMBIO---\n"; opt1.swap(opt2); imprimir_opcionales("Después del intercambio"); }
Salida:
Antes del intercambio: opt1 contiene 'Primer texto ejemplo' opt2 contiene 'Segundo texto' ---INTERCAMBIO--- Después del intercambio: opt1 contiene 'Segundo texto' opt2 contiene 'Primer texto ejemplo' Antes del intercambio: opt1 contiene 'Lorem ipsum dolor sit amet, consectetur tincidunt.' opt2 contiene '' ---INTERCAMBIO--- Después del intercambio: opt1 contiene '' opt2 contiene 'Lorem ipsum dolor sit amet, consectetur tincidunt.'
[editar] Véase también
(C++17) |
Especializa el algoritmo std::swap. (función) |