std::optional<T>::operator=
optional& operator=( std::nullopt_t ) noexcept;
|
(1) | (начиная с C++17) (constexpr начиная с C++20) |
constexpr optional& operator=( const optional& other );
|
(2) | (начиная с C++17) |
constexpr optional& operator=( optional&& other ) noexcept(/* see below */);
|
(3) | (начиная с C++17) |
template< class U = std::remove_cv_t<T> >
optional& operator=( U&& value );
|
(4) | (начиная с C++17) (constexpr начиная с C++20) |
template< class U >
optional& operator=( const optional<U>& other );
|
(5) | (начиная с C++17) (constexpr начиная с C++20) |
template< class U >
optional& operator=( optional<U>&& other );
|
(6) | (начиная с C++17) (constexpr начиная с C++20) |
Заменяет содержимое *this на содержимое other.
*this содержит значение до вызова, хранимое значение уничтожается вызовом его деструктора, как если бы через value().T::~T(). После этого вызова *this не содержит значения.other.
- Если и
*this, иotherне содержат значения, функция не имеет эффекта. - Если
*thisсодержит значение, аotherне содержит, то хранимое значение уничтожается вызовом его деструктора. После вызова*thisне содержит значения. - Если
otherсодержит значение, то в зависимости от того, содержит ли*thisзначение, хранимое значение либо прямо инициализируется, либо присваивается из*other(2) илиstd::move(*other)(3). Обратите внимание, что перемещённый optional по-прежнему содержит значение. - Перегрузка (2) удалена, если либо
std::is_copy_constructible_v<T>, либоstd::is_copy_assignable_v<T>являетсяfalse. Она тривиальна, еслиstd::is_trivially_copy_constructible_v<T>,std::is_trivially_copy_assignable_v<T>иstd::is_trivially_destructible_v<T>все являютсяtrue. - Перегрузка (3) не участвует в разрешении перегрузки, если либо
std::is_move_constructible_v<T>, либоstd::is_move_assignable_v<T>являетсяfalse. Она тривиальна, еслиstd::is_trivially_move_constructible_v<T>,std::is_trivially_move_assignable_v<T>иstd::is_trivially_destructible_v<T>все являютсяtrue.
*this значение до вызова, хранимое значение либо прямо инициализируется из std::forward<U>(value), либо присваивается из std::forward<U>(value). Функция не участвует в разрешении перегрузки, если только std::decay_t<U>(до C++20)std::remove_cvref_t<U>(начиная с C++20) не является std::optional<T>, std::is_constructible_v<T, U> является true, std::is_assignable_v<T&, U> является true, и выполняется хотя бы одно из следующих условий:
Tне является скалярным типом;std::decay_t<U>не являетсяT.
other.
- Если и
*this, иotherне содержат значения, функция не имеет эффекта. - Если
*thisсодержит значение, аotherне содержит, то хранимое значение уничтожается вызовом его деструктора. После вызова*thisне содержит значения. - Если
otherсодержит значение, то в зависимости от того, содержит ли*thisзначение, хранимое значение либо прямо инициализируется, либо присваивается из*other(5) илиstd::move(*other)(6). Обратите внимание, что перемещённый optional по-прежнему содержит значение. - Эти перегрузки не участвуют в разрешении перегрузки, если не выполнены следующие условия:
Tне является конструируемым, преобразуемым или присваиваемым из любого выражения типа (возможно,const)std::optional<U>, т.е. следующие 12 черт типов все являются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>&&>
- Для перегрузки (5),
std::is_constructible_v<T, const U&>иstd::is_assignable_v<T&, const U&>оба являютсяtrue. - Для перегрузки (6),
std::is_constructible_v<T, U>иstd::is_assignable_v<T&, U>оба являютсяtrue.
Параметры
| other | - |
другой
optional
объект, чьё содержащееся значение нужно присвоить
|
| value | - | значение для присвоения содержащемуся значению |
Возвращаемое значение
* this
Исключения
T
. Если исключение выброшено, состояние инициализации
*
this
(и
other
в случае
(
2-5
)
) остается неизменным, т.е. если объект содержал значение, он продолжает содержать значение, и наоборот. Содержимое
value
и содержащиеся значения
*
this
и
other
зависят от гарантий безопасности исключений операции, из которой происходит исключение (конструктор копирования, перемещающее присваивание и т.д.).
std:: is_nothrow_move_constructible_v < T > )
Примечания
Необязательный объект
op
может быть преобразован в пустой опциональный объект с помощью как
op
=
{
}
;
, так и
op
=
nullopt
;
. Первое выражение создает пустой объект
optional
с помощью
{
}
и присваивает его
op
.
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_optional
|
202106L
|
(C++20)
(DR20) |
Полностью constexpr ( 1 ) , ( 4-6 ) |
Пример
#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'; }
Вывод:
abc def
Отчеты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 3886 | C++17 |
аргумент шаблона по умолчанию для перегрузки
(
6
)
был
T
|
изменён на std:: remove_cv_t < T > |
| P0602R4 | C++17 |
оператор копирующего/перемещающего присваивания может не быть тривиальным
даже если базовые операции тривиальны |
требуется распространение тривиальности |
| P2231R1 | C++20 | перегрузки ( 1,4-6 ) не были constexpr | сделаны constexpr |
Смотрите также
|
создает содержащееся значение на месте
(публичная функция-член) |