std::expected<T,E>:: operator=
|
Основной шаблон
|
||
|
constexpr
expected
&
operator
=
(
const
expected
&
other
)
;
|
(1) | (начиная с C++23) |
|
constexpr
expected
&
operator
=
(
expected
&&
other
)
noexcept ( /* см. ниже */ ) ; |
(2) | (начиная с C++23) |
|
template
<
class
U
=
std::
remove_cv_t
<
T
>
>
constexpr expected & operator = ( U && v ) ; |
(3) | (начиная с C++23) |
|
template
<
class
G
>
constexpr expected & operator = ( const std:: unexpected < G > & e ) ; |
(4) | (начиная с C++23) |
|
template
<
class
G
>
constexpr expected & operator = ( std:: unexpected < G > && e ) ; |
(5) | (начиная с C++23) |
|
void
частичная специализация
|
||
|
constexpr
expected
&
operator
=
(
const
expected
&
other
)
;
|
(6) | (начиная с C++23) |
|
constexpr
expected
&
operator
=
(
expected
&&
other
)
noexcept ( /* см. ниже */ ) ; |
(7) | (начиная с C++23) |
|
template
<
class
G
>
constexpr expected & operator = ( const std:: unexpected < G > & e ) ; |
(8) | (начиная с C++23) |
|
template
<
class
G
>
constexpr expected & operator = ( std:: unexpected < G > && e ) ; |
(9) | (начиная с C++23) |
|
Шаблон вспомогательной функции
|
||
|
template
<
class
T,
class
U,
class
...
Args
>
constexpr void /*reinit-expected*/ ( T & newval, U & oldval, Args && ... args ) |
(10) |
(начиная с C++23)
( только для демонстрации* ) |
Присваивает новое значение существующему объекту
expected
.
Содержание |
Параметры
| other | - |
другой
expected
объект, чьё содержащееся значение нужно присвоить
|
| v | - | значение для присваивания содержащемуся значению |
| e | - | std::unexpected объект, чьё содержащееся значение нужно присвоить |
| newval | - | содержащееся значение для конструирования |
| oldval | - | содержащееся значение для уничтожения |
| args | - | аргументы, используемые как инициализаторы newval |
Эффекты
Основные операторы присваивания шаблона
has_value()
и
rhs.
has_value
(
)
имеют разные значения (т.е. один из
*
this
и
other
содержит ожидаемое значение
val
а другой содержит неожиданное значение
unex
), вызывается шаблон функции только для экспозиции
reinit-expected
для безопасного обновления состояния.
Значение
has_value()
|
Значение other. has_value ( ) | |
|---|---|---|
| true | false | |
| true |
val
=
*
other
;
|
reinit-expected
(
unex
,
val
, other.
error
(
)
)
;
|
| false |
reinit-expected
(
val
,
unex
,
*
other
)
;
|
unex
=
other.
error
(
)
;
|
Значение
has_value()
|
Значение 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
(
)
;
.
Значение
has_value()
|
Эквивалентно |
|---|---|
| true |
val
=
std::
forward
<
U
>
(
v
)
;
|
| false |
reinit-expected
(
val
,
unex
,
std::
forward
<
U
>
(
v
)
)
;
has_val
=
false
;
|
| Перегрузка |
Значение
has_value()
|
Эквивалентно |
|---|---|---|
| ( 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 операторы присваивания частичной специализации
Значение
has_value()
|
Значение other. has_value ( ) | |
|---|---|---|
| true | false | |
| true | (нет эффекта) |
std::
construct_at
(
std::
addressof
(
unex
)
, rhs.
unex
)
;
has_val
=
false
;
|
| false |
std::
destroy_at
(
std::
addressof
(
unex
)
)
;
has_val
=
true
;
|
unex
=
other.
error
(
)
;
|
Значение
has_value()
|
Значение other. has_value ( ) | |
|---|---|---|
| true | false | |
| true | (нет эффекта) |
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
(
)
)
;
|
| Перегрузка |
Значение
has_value()
|
Эквивалентно |
|---|---|---|
| ( 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
(
)
)
;
|
Шаблон вспомогательной функции
Экспозиционная шаблонная функция
reinit-expected
«определяется» следующим образом:
template<class NewType, class OldType, class... Args> constexpr void reinit-expected(NewType& new_val, OldType& old_val, Args&&... args) { // Случай 1: конструирование "new_val" не выбрасывает исключения: // "new_val" может быть напрямую сконструирован после уничтожения "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)...); } // Случай 2: перемещающее конструирование "new_val" не выбрасывает исключения: // сначала конструируем временный объект NewType // ("old_val" остается нетронутым, если из этого конструирования выбрасывается исключение) else if constexpr (std::is_nothrow_move_constructible_v<NewType>) { NewType temp(std::forward<Args>(args)...); // может выбросить исключение std::destroy_at(std::addressof(old_val)); std::construct_at(std::addressof(new_val), std::move(temp)); } // Случай 3: конструирование "new_val" потенциально выбрасывает исключения: // требуется резервная копия "old_val" для восстановления после исключения else { OldType temp(std::move(old_val)); // может выбросить исключение std::destroy_at(std::addressof(old_val)); try { std::construct_at(std::addressof(new_val), std::forward<Args>(args)...); // может выбросить исключение } catch (...) { std::construct_at(std::addressof(old_val), std::move(temp)); throw; } } }
Этот шаблон функции вызывается, когда присваивание приведет к тому, что * this будет содержать альтернативное значение (т.е. переход от ожидаемого значения к неожиданному значению, или от неожиданного значения к ожидаемому значению).
В данном случае старое значение oldval должно быть уничтожено перед созданием нового значения newval . Однако создание newval может вызвать исключение. Для обеспечения строгой гарантии безопасности исключений старое значение должно быть восстановлено перед повторным выбросом исключения, чтобы * this находился в валидном состоянии во время обработки исключения.
Возвращаемое значение
Ограничения и дополнительная информация
Основные операторы присваивания шаблона
- std:: is_same_v < expected, std:: remove_cvref_t < U >> равно false .
-
std::
remove_cvref_t
<
U
>
не является специализацией
std::unexpected. -
Все следующие значения равны
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 операторы присваивания частичной специализации
Исключения
std::
is_nothrow_move_constructible_v
<
T
>
&&
std::
is_nothrow_move_assignable_v
<
T
>
&&
Пример
|
Этот раздел не завершён
Причина: отсутствует пример |
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 3886 | C++23 |
аргумент шаблона по умолчанию для перегрузки
(
3
)
был
T
|
изменён на std:: remove_cv_t < T > |
| LWG 4025 | C++23 |
перегрузка
(
7
)
была определена как удалённая, если
E
не является
перемещаемо конструируемым или не перемещаемо присваиваемой |
она не участвует в
разрешении перегрузки в этом случае |
Смотрите также
|
создаёт ожидаемое значение на месте
(публичная функция-член) |