std::expected<T,E>:: operator=
|
Plantilla principal
|
||
|
constexpr
expected
&
operator
=
(
const
expected
&
other
)
;
|
(1) | (desde C++23) |
|
constexpr
expected
&
operator
=
(
expected
&&
other
)
noexcept ( /* ver más abajo */ ) ; |
(2) | (desde C++23) |
|
template
<
class
U
=
std::
remove_cv_t
<
T
>
>
constexpr expected & operator = ( U && v ) ; |
(3) | (desde C++23) |
|
template
<
class
G
>
constexpr expected & operator = ( const std:: unexpected < G > & e ) ; |
(4) | (desde C++23) |
|
template
<
class
G
>
constexpr expected & operator = ( std:: unexpected < G > && e ) ; |
(5) | (desde C++23) |
|
void
especialización parcial
|
||
|
constexpr
expected
&
operator
=
(
const
expected
&
other
)
;
|
(6) | (desde C++23) |
|
constexpr
expected
&
operator
=
(
expected
&&
other
)
noexcept ( /* ver más abajo */ ) ; |
(7) | (desde C++23) |
|
template
<
class
G
>
constexpr expected & operator = ( const std:: unexpected < G > & e ) ; |
(8) | (desde C++23) |
|
template
<
class
G
>
constexpr expected & operator = ( std:: unexpected < G > && e ) ; |
(9) | (desde C++23) |
|
Plantilla de función auxiliar
|
||
|
template
<
class
T,
class
U,
class
...
Args
>
constexpr void /*reinit-expected*/ ( T & newval, U & oldval, Args && ... args ) |
(10) |
(desde C++23)
( solo para exposición* ) |
Asigna un nuevo valor a un objeto
expected
existente.
Contenidos |
Parámetros
| other | - |
otro objeto
expected
cuyo valor contenido asignar
|
| v | - | valor a asignar al valor contenido |
| e | - | std::unexpected objeto cuyo valor contenido asignar |
| newval | - | el valor contenido a ser construido |
| oldval | - | el valor contenido a ser destruido |
| args | - | los argumentos usados como inicializadores de newval |
Efectos
Operadores de asignación de plantilla primaria
has_value()
y
rhs.
has_value
(
)
tienen valores diferentes (es decir, uno de
*
this
y
other
contiene un valor esperado
val
y el otro contiene un valor inesperado
unex
), se llama a la plantilla de función solo-exposición
reinit-expected
para actualizar el estado de forma segura.
Valor de
has_value()
|
Valor de other. has_value ( ) | |
|---|---|---|
| true | false | |
| true |
val
=
*
other
;
|
reinit-expected
(
unex
,
val
, other.
error
(
)
)
;
|
| false |
reinit-expected
(
val
,
unex
,
*
other
)
;
|
unex
=
other.
error
(
)
;
|
Valor de
has_value()
|
Valor de other. has_value ( ) | |
|---|---|---|
| true | false | |
| true |
val
=
std
::
move
(
*
other
)
;
|
reinit-expected
(
unex
,
val
, std
::
move
(
other.
error
(
)
)
)
;
|
| false |
reinit-expected
(
val
,
unex
,
std
::
move
(
*
other
)
)
;
|
unex
=
std
::
move
(
other.
error
(
)
)
;
|
has_val
=
other.
has_value
(
)
;
.
Valor de
has_value()
|
Equivalente a |
|---|---|
| true |
val
=
std::
forward
<
U
>
(
v
)
;
|
| false |
reinit-expected
(
val
,
unex
,
std::
forward
<
U
>
(
v
)
)
;
has_val
=
false
;
|
| Sobrecarga |
Valor de
has_value()
|
Equivalente a |
|---|---|---|
| ( 4 ) | true |
reinit-expected
(
val
,
unex
,
std::
forward
<
const
G
&
>
(
e.
error
(
)
)
)
;
has_val
=
false
;
|
| false |
unex
=
std::
forward
<
const
G
&
>
(
e.
error
(
)
)
;
|
|
| ( 5 ) | true |
reinit-expected
(
val
,
unex
,
std::
forward
<
G
>
(
e.
error
(
)
)
)
;
has_val
=
false
;
|
| false |
unex
=
std::
forward
<
G
>
(
e.
error
(
)
)
;
|
void operadores de asignación de especialización parcial
Valor de
has_value()
|
Valor de other. has_value ( ) | |
|---|---|---|
| true | false | |
| true | (sin efectos) |
std::
construct_at
(
std::
addressof
(
unex
)
, rhs.
unex
)
;
has_val
=
false
;
|
| false |
std::
destroy_at
(
std::
addressof
(
unex
)
)
;
has_val
=
true
;
|
unex
=
other.
error
(
)
;
|
Valor de
has_value()
|
Valor de other. has_value ( ) | |
|---|---|---|
| true | false | |
| true | (sin efectos) |
std::
construct_at
(
std::
addressof
(
unex
)
,
std
::
move
(
rhs.
unex
)
)
;
has_val
=
false
;
|
| false |
std::
destroy_at
(
std::
addressof
(
unex
)
)
;
has_val
=
true
;
|
unex
=
std
::
move
(
other.
error
(
)
)
;
|
| Sobrecarga |
Valor de
has_value()
|
Equivalente a |
|---|---|---|
| ( 8 ) | true |
std::
construct_at
(
std::
addressof
(
unex
)
,
std::
forward
<
const
G
&
>
(
e.
error
(
)
)
)
;
has_val
=
false
;
|
| false |
unex
=
std::
forward
<
const
G
&
>
(
e.
error
(
)
)
;
|
|
| ( 9 ) | true |
std::
construct_at
(
std::
addressof
(
unex
)
,
std::
forward
<
G
>
(
e.
error
(
)
)
)
;
has_val
=
false
;
|
| false |
unex
=
std::
forward
<
G
>
(
e.
error
(
)
)
;
|
Plantilla de función auxiliar
La plantilla de función solo para exposición
reinit-expected
se "define" de la siguiente manera:
template<class NewType, class OldType, class... Args> constexpr void reinit-expected(NewType& new_val, OldType& old_val, Args&&... args) { // Caso 1: la construcción de "new_val" no lanza excepciones: // "new_val" puede construirse directamente después de destruir "old_val" if constexpr (std::is_nothrow_constructible_v<NewType, Args...>) { std::destroy_at(std::addressof(old_val)); std::construct_at(std::addressof(new_val), std::forward<Args>(args)...); } // Caso 2: la construcción por movimiento de "new_val" no lanza excepciones: // construir primero un objeto temporal NewType // ("old_val" permanece intacto si se lanza una excepción durante esta construcción) else if constexpr (std::is_nothrow_move_constructible_v<NewType>) { NewType temp(std::forward<Args>(args)...); // puede lanzar excepción std::destroy_at(std::addressof(old_val)); std::construct_at(std::addressof(new_val), std::move(temp)); } // Caso 3: la construcción de "new_val" puede lanzar excepciones: // se requiere una copia de seguridad de "old_val" para recuperarse de una excepción else { OldType temp(std::move(old_val)); // puede lanzar excepción std::destroy_at(std::addressof(old_val)); try { std::construct_at(std::addressof(new_val), std::forward<Args>(args)...); // puede lanzar excepción } catch (...) { std::construct_at(std::addressof(old_val), std::move(temp)); throw; } } }
Esta plantilla de función se llama cuando la asignación va a hacer que * this contenga el valor alternativo (es decir, de valor esperado a valor inesperado, o de valor inesperado a valor esperado).
En este caso, el valor antiguo oldval necesita ser destruido antes de construir el nuevo valor newval . Sin embargo, la construcción de newval puede lanzar una excepción. Para proporcionar garantía de seguridad de excepciones fuerte , el valor antiguo necesita ser restaurado antes de relanzar la excepción para que * this mantenga un estado válido mientras se maneja la excepción.
Valor de retorno
Restricciones e información complementaria
Operadores de asignación de plantilla principal
- std:: is_same_v < expected, std:: remove_cvref_t < U >> es false .
-
std::
remove_cvref_t
<
U
>
no es una especialización de
std::unexpected. -
Todos los siguientes valores son
true
:
- std:: is_constructible_v < T, U >
- std:: is_assignable_v < T & , U >
-
std::
is_nothrow_constructible_v
<
T, U
>
||
std::
is_nothrow_move_constructible_v
<
T
>
||
std:: is_nothrow_move_constructible_v < E >
- std:: is_constructible_v < E, const G & >
- std:: is_assignable_v < E & , const G & >
-
std::
is_nothrow_constructible_v
<
E,
const
G
&
>
||
std::
is_nothrow_move_constructible_v
<
T
>
||
std:: is_nothrow_move_constructible_v < E >
- std:: is_constructible_v < E, G >
- std:: is_assignable_v < E & , G >
-
std::
is_nothrow_constructible_v
<
E, G
>
||
std::
is_nothrow_move_constructible_v
<
T
>
||
std:: is_nothrow_move_constructible_v < E >
void operadores de asignación de especialización parcial
Excepciones
std::
is_nothrow_move_constructible_v
<
T
>
&&
std::
is_nothrow_move_assignable_v
<
T
>
&&
Ejemplo
|
Esta sección está incompleta
Razón: sin ejemplo |
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3886 | C++23 |
el argumento de plantilla por defecto de la sobrecarga
(
3
)
era
T
|
cambiado a std:: remove_cv_t < T > |
| LWG 4025 | C++23 |
la sobrecarga
(
7
)
se definía como eliminada si
E
no es
move constructible o no es move assignable |
no participa en la
resolución de sobrecarga en este caso |
Véase también
|
construye el valor esperado in-situ
(función miembro pública) |