Namespaces
Variants

std::optional<T>::operator=

De es.cppreference.net
 
 
Biblioteca de utilidades
Soporte del lenguaje
Soporte de tipos (tipos básicos, RTTI)
Macros de prueba de características de la biblioteca (C++20)
Utilidades del programa
Funciones variádicas
Soporte de corrutinas (C++20)
Soporte de contratos (C++26)
Comparación a tres vías
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilidades generales
Operadores relacionales (obsoleto en C++20)
 
 
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.

1) Si *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.
2,3) Asigna el estado de other.
  • Si tanto *this como other no contienen un valor, la función no tiene efecto.
  • Si *this contiene un valor, pero other no, entonces el valor contenido se destruye llamando a su destructor. *this no contiene un valor después de la llamada.
  • Si other contiene un valor, entonces, dependiendo de si *this contiene un valor, el valor contenido se inicializa directamente o se asigna desde *other (2) o std::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> o std::is_copy_assignable_v<T> es false. Es trivial si std::is_trivially_copy_constructible_v<T>, std::is_trivially_copy_assignable_v<T> y std::is_trivially_destructible_v<T> son todos true.
  • La sobrecarga (3) no participa en la resolución de sobrecarga cuando std::is_move_constructible_v<T> o std::is_move_assignable_v<T> es false. Es trivial si std::is_trivially_move_constructible_v<T>, std::is_trivially_move_assignable_v<T> y std::is_trivially_destructible_v<T> son todos true.
4) Asignación con reenvío perfecto: dependiendo de si *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:
5,6) Asigna el estado de other.
  • Si tanto *this como other no contienen un valor, la función no tiene efecto.
  • Si *this contiene un valor, pero other no, entonces el valor contenido se destruye llamando a su destructor. *this no contiene un valor después de la llamada.
  • Si other contiene un valor, entonces, dependiendo de si *this contiene un valor, el valor contenido se inicializa directamente o se asigna desde *other (5) o std::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:
    • T no se puede construir, convertir o asignar desde ninguna expresión de tipo (posiblemente const) std::optional<U>, i.e., los siguientes 12 rasgos de tipo son todos false:
      • 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&> y std::is_assignable_v<T&, const U&> son ambos true.
    • Para la sobrecarga (6), std::is_constructible_v<T, U> y std::is_assignable_v<T&, U> son ambos true.

Parámetros

otro - otro objeto optional cuyo valor contenido asignar
valor - valor a asignar al valor contenido

Valor de retorno

* this

Excepciones

2-6) Lanza cualquier excepción lanzada por el constructor u operador de asignación de 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.).
3) Tiene la siguiente

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)