std::optional<T>::swap - cppreference.com
De cppreference.com
|
|
(desde C++17) | |
Intercambia el contenido con el de other.
- Si ni
*thisniothercontienen un valor, esta función no tiene efecto.
- Si solo uno de
*thisyothercontiene un valor (llamemos a este objetoiny al otroun), el valor contenido deunes inicializado directamente desdestd::move(*in), seguido por la destrucción del valor contenido deincomo si lo fuera porin->T::~T(). Después de esta llamada,inno contiene un valor;uncontiene un valor.
- Si tanto
*thiscomoothercontienen un valor, los valores contenidos se intercambian llamando ausing std::swap; swap(**this, *other). Los lvaluesTdeben satisfacer a Swappable.
El programa está mal formado si std::is_move_constructible_v<T> es false.
Parámetros
| other | - | El objeto optional con el cual intercambiar el contenido.
|
Valor de retorno
(Ninguno)
Excepciones
Especificación
noexcept: (desde C++11)
|
|
||
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.
Ejemplo
#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.'