std::optional<T>::operator=
optional& operator=( std::nullopt_t ) noexcept;
|
(1) | (desde C++17) (constexpr desde C++20) |
constexpr optional& operator=( const optional& other );
|
(2) | (desde C++17) |
constexpr optional& operator=( optional&& other ) noexcept(/* see below */);
|
(3) | (desde C++17) |
template< class U = std::remove_cv_t<T> >
optional& operator=( U&& value );
|
(4) | (desde C++17) (constexpr desde C++20) |
template< class U >
optional& operator=( const optional<U>& other );
|
(5) | (desde C++17) (constexpr desde C++20) |
template< class U >
optional& operator=( optional<U>&& other );
|
(6) | (desde C++17) (constexpr desde C++20) |
Reemplaza el contenido de *this con el contenido de other.
*this contiene un valor antes de la llamada, el valor contenido se destruye llamando a su destructor como si fuera value().T::~T(). *this no contiene un valor después de esta llamada.other.
- Si tanto
*thiscomootherno contienen un valor, la función no tiene efecto. - Si
*thiscontiene un valor, perootherno, entonces el valor contenido se destruye llamando a su destructor.*thisno contiene un valor después de la llamada. - Si
othercontiene un valor, entonces, dependiendo de si*thiscontiene un valor, el valor contenido se inicializa directamente o se asigna desde*other(2) ostd::move(*other)(3). Nótese que un optional desde el que se ha movido aún contiene un valor. - La sobrecarga (2) se elimina cuando
std::is_copy_constructible_v<T>ostd::is_copy_assignable_v<T>esfalse. Es trivial sistd::is_trivially_copy_constructible_v<T>,std::is_trivially_copy_assignable_v<T>ystd::is_trivially_destructible_v<T>son todostrue. - La sobrecarga (3) no participa en la resolución de sobrecarga cuando
std::is_move_constructible_v<T>ostd::is_move_assignable_v<T>esfalse. Es trivial sistd::is_trivially_move_constructible_v<T>,std::is_trivially_move_assignable_v<T>ystd::is_trivially_destructible_v<T>son todostrue.
*this contiene un valor antes de la llamada, el valor contenido se inicializa directamente desde std::forward<U>(value) o se asigna desde std::forward<U>(value). La función no participa en la resolución de sobrecarga a menos que std::decay_t<U>(hasta C++20)std::remove_cvref_t<U>(desde C++20) no sea std::optional<T>, std::is_constructible_v<T, U> sea true, std::is_assignable_v<T&, U> sea true, y al menos una de las siguientes condiciones sea verdadera:
Tno es un tipo escalar;std::decay_t<U>no esT.
other.
- Si tanto
*thiscomootherno contienen un valor, la función no tiene efecto. - Si
*thiscontiene un valor, perootherno, entonces el valor contenido se destruye llamando a su destructor.*thisno contiene un valor después de la llamada. - Si
othercontiene un valor, entonces, dependiendo de si*thiscontiene un valor, el valor contenido se inicializa directamente o se asigna desde*other(5) ostd::move(*other)(6). Nótese que un optional desde el que se ha movido aún contiene un valor. - Estas sobrecargas no participan en la resolución de sobrecarga a menos que se cumplan las siguientes condiciones:
Tno se puede construir, convertir o asignar desde ninguna expresión de tipo (posiblementeconst)std::optional<U>, i.e., los siguientes 12 rasgos de tipo son todosfalse:std::is_constructible_v<T, std::optional<U>&>std::is_constructible_v<T, const std::optional<U>&>std::is_constructible_v<T, std::optional<U>&&>std::is_constructible_v<T, const std::optional<U>&&>std::is_convertible_v<std::optional<U>&, T>std::is_convertible_v<const std::optional<U>&, T>std::is_convertible_v<std::optional<U>&&, T>std::is_convertible_v<const std::optional<U>&&, T>std::is_assignable_v<T&, std::optional<U>&>std::is_assignable_v<T&, const std::optional<U>&>std::is_assignable_v<T&, std::optional<U>&&>std::is_assignable_v<T&, const std::optional<U>&&>
- Para la sobrecarga (5),
std::is_constructible_v<T, const U&>ystd::is_assignable_v<T&, const U&>son ambostrue. - Para la sobrecarga (6),
std::is_constructible_v<T, U>ystd::is_assignable_v<T&, U>son ambostrue.
Parámetros
| otro | - |
otro objeto
optional
cuyo valor contenido asignar
|
| valor | - | valor a asignar al valor contenido |
Valor de retorno
* this
Excepciones
T
. Si se lanza una excepción, el estado de inicialización de
*
this
(y de
other
en el caso de
(
2-5
)
) permanece sin cambios, es decir, si el objeto contenía un valor, sigue conteniendo un valor, y viceversa. El contenido de
value
y los valores contenidos de
*
this
y
other
dependen de las garantías de seguridad ante excepciones de la operación desde la que se origina la excepción (constructor de copia, asignación de movimiento, etc.).
std:: is_nothrow_move_constructible_v < T > )
Notas
Un objeto opcional
op
puede convertirse en un optional vacío tanto con
op
=
{
}
;
como con
op
=
nullopt
;
. La primera expresión construye un objeto
optional
vacío con
{
}
y lo asigna a
op
.
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_optional
|
202106L
|
(C++20)
(DR20) |
Completamente constexpr ( 1 ) , ( 4-6 ) |
Ejemplo
#include <iostream> #include <optional> int main() { std::optional<const char*> s1 = "abc", s2; // constructor s2 = s1; // assignment s1 = "def"; // decaying assignment (U = char[4], T = const char*) std::cout << *s2 << ' ' << *s1 << '\n'; }
Salida:
abc def
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3886 | C++17 |
el argumento de plantilla predeterminado de la sobrecarga
(
6
)
era
T
|
cambiado a std:: remove_cv_t < T > |
| P0602R4 | C++17 |
el operador de asignación de copia/traslado podría no ser trivial
incluso si las operaciones subyacentes son triviales |
requerido propagar trivialidad |
| P2231R1 | C++20 | las sobrecargas ( 1,4-6 ) no eran constexpr | convertidas en constexpr |
Véase también
|
construye el valor contenido in-situ
(función miembro pública) |