Namespaces
Variants

std::optional<T>::operator=

Из ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы проверки возможностей библиотеки (C++20)
Утилиты программ
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
Функции сравнения целых чисел
(C++20)(C++20)(C++20)    
(C++20)
Swap и операции с типами
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Типы общеупотребительной лексики
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
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.

1) Если *this содержит значение до вызова, хранимое значение уничтожается вызовом его деструктора, как если бы через value().T::~T(). После этого вызова *this не содержит значения.
2,3) Присваивает состояние 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.
4) Присваивание с идеальной пересылкой: в зависимости от того, содержит ли *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, и выполняется хотя бы одно из следующих условий:
5,6) Присваивает состояние 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

Исключения

2-6) Выбрасывает любое исключение, выброшенное конструктором или оператором присваивания T . Если исключение выброшено, состояние инициализации * this (и other в случае ( 2-5 ) ) остается неизменным, т.е. если объект содержал значение, он продолжает содержать значение, и наоборот. Содержимое value и содержащиеся значения * this и other зависят от гарантий безопасности исключений операции, из которой происходит исключение (конструктор копирования, перемещающее присваивание и т.д.).
3) Имеет следующую

Примечания

Необязательный объект 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

Смотрите также

создает содержащееся значение на месте
(публичная функция-член)