std::optional<T>::operator=
De cppreference.com
<tbody>
</tbody>
optional& operator=( std::nullopt_t ) noexcept; |
(1) | (desde C++17) |
constexpr optional& operator=( const optional& other ); |
(2) | (desde C++17) |
constexpr optional& operator=( optional&& other ) noexcept(/* véase más abajo */); |
(3) | (desde C++17) |
template< class U = T > optional& operator=( U&& value ); |
(4) | (desde C++17) |
template< class U > optional& operator=( const optional<U>& other ); |
(5) | (desde C++17) |
template< class U > optional& operator=( optional<U>&& other ); |
(6) | (desde C++17) |
Reemplaza el contenido de *this con el contenido de other.
1) Si
*this contiene un valor antes de la llamada, el valor contenido se destruye llamando a su destructor como si lo fuera por value().T::~T(). *this no contiene un valor después de esta llamada.2-3) Asigna el estado de
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 esta llamada. - Si
othercontiene un valor, entonces dependiendo si*thiscontiene un valor, el valor contenido es o bien inicializado directamente o asignado de*other(2) ostd::move(*other)(3). Observa que unoptionalcuyo valor ha sido movido aún contiene un valor. - La sobrecarga (2) se define como eliminada a menos que
std::is_copy_constructible_v<T>ystd::is_copy_assignable_v<T>sean ambastrue. Es trivial sistd::is_trivially_copy_constructible_v<T>,std::is_trivially_copy_assignable_v<T>ystd::is_trivially_destructible_v<T>son todastrue. - La sobrecarga (3) no participa en la resolución de sobrecargas a menos que
std::is_move_constructible_v<T>ystd::is_move_assignable_v<T>sean ambastrue. Es trivial sistd::is_trivially_move_constructible_v<T>,std::is_trivially_move_assignable_v<T>ystd::is_trivially_destructible_v<T>son todastrue.
4) Asignación de reenvío perfecto: Dependiendo si
*this contiene un valor antes de la llamada, el valor contenido es o bien inicializado directamente de std::forward<U>(value) o asignado de std::forward<U>(value). La función no participa en la resolución de sobrecargas 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 uno de los siguientes sea verdadero: Tno es un tipo escalar;std::decay_t<U>no esT.
5-6) Asigna el estado de
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 esta llamada. - Si
othercontiene un valor, entonces dependiendo si*thiscontiene un valor, el valor contenido es o bien inicializado directamente o asignado de*other(5) ostd::move(*other)(6). Observa que unoptionalcuyo valor ha sido movido aún contiene un valor. - Estas sobrecargas no participan en la resolución de sobrecargas a menos que se cumplan las siguientes condiciones:
Tno es construible, convertible, o asignable de cualquier expresión de tipo (posiblementeconst)std::optional<U>, es decir, 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 ambastrue. - Para la sobrecarga (6),
std::is_constructible_v<T, U>ystd::is_assignable_v<T&, U>son ambastrue.
Parámetros
| other | - | Otro objeto optional cuyo valor contenido hay que asignar.
|
| value | - | Valor a asignar al valor contenido. |
Valor de retorno
*this
Excepciones
2-6) Lanza cualquier excepción lanzada por el constructor o el operador de asignación de
(3) tiene la siguiente
T. Si se lanza una excepción, el estado de inicialización de *this (y de other en caso de (2-3) y (5-6) ) no ha cambiado, es decir, si el objeto contenía un valor, todavía contiene un valor, y viceversa. El contenido de value y los valores contenidos de *this y de other dependen de las garantías de seguridad de excepciones de la operación de la que se origina la excepción (constructor de copia, asignación de movimiento, etc.). (3) tiene la siguiente
Especificación noexcept: (desde C++11)
<tbody>
</tbody>
noexcept(std::is_nothrow_move_assignable<T>::value && std::is_nothrow_move_constructible<T>::value) |
||
Notas
Un objeto optional 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.
Ejemplo
Ejecuta este código
#include <optional>
#include <iostream>
int main()
{
std::optional<const char*> s1 = "abc", s2; // constructor
s2 = s1; // asignación
s1 = "def"; // asignación decadente (U = char[4], T = const char*)
std::cout << *s2 << ' ' << *s1 << '\n';
}
Salida:
abc def
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| P0602R4 | C++17 | Los constructores de copia/movimiento pueden no ser triviales incluso si el constructor subyacente es trivial. | Se requirió que propagase la trivialidad. |
Véase también
See also
| Construye el valor contenido en el sitio. (función miembro pública) |