Namespaces
Variants

std::optional<T>:: operator=

From cppreference.net
Utilities library
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 ( /* см. ниже */ ) ;
(3) (начиная с C++17)
template < class U >
optional & operator = ( const optional < U > & other ) ;
(4) (начиная с C++17)
(constexpr начиная с C++20)
template < class U >
optional & operator = ( optional < U > && other ) ;
(5) (начиная с C++17)
(constexpr начиная с C++20)
template < class U = std:: remove_cv_t < T > >
optional & operator = ( U && value ) ;
(6) (начиная с C++17)
(constexpr начиная с C++20)

Заменяет содержимое * this содержимым other .

1) Если * this содержит значение, вызывает val  - > T :: ~T ( ) для уничтожения содержащегося значения; в противном случае не оказывает эффекта. * this не содержит значения после этого вызова.
2-5) Присваивает состояние other . has_value() возвращает other. has_value ( ) после этого вызова.
Эффект * this содержит значение * this не содержит значения
other содержит значение
  • для перегрузок (2,4) , присваивает * other содержащемуся значению
  • для перегрузок (3,5) , присваивает std :: move ( * other ) содержащемуся значению
other не содержит значения уничтожает содержащееся значение вызовом val  - > T :: ~T ( ) нет эффекта
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 > оба равны true .
Если std:: is_trivially_move_constructible_v < T > , std:: is_trivially_move_assignable_v < T > и std:: is_trivially_destructible_v < T > все равны true , то оператор присваивания является тривиальным.
4,5) These overloads participate in overload resolution only if all following conditions are satisfied:
6) Если * this содержит значение, присваивает std:: forward < U > ( value ) содержащемуся значению; иначе прямое-не-списочное-инициализирует содержащееся значение с помощью std:: forward < U > ( value ) . * this содержит значение после этого вызова.
Эта перегрузка участвует в разрешении перегрузки только при выполнении всех следующих условий:
  1. Другими словами, T не является конструируемым, конвертируемым или присваиваемым из любого выражения типа (возможно const-квалифицированного) std:: optional < U >

Содержание

Параметры

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

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

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