Пространства имён
Варианты
Действия

std::expected<T,E>::operator=

Материал из cppreference.com
< cpp‎ | utility‎ | expected
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
std::expected
Функции-элементы
expected::operator=
Наблюдатели
Монадические операции
Модификаторы
Функции, не являющиеся элементами
Вспомогательные классы
 
constexpr expected& operator=( const expected& other );
(1) (начиная с C++23)
constexpr expected& operator=( expected&& other ) noexcept(/*смотрите ниже*/);
(2) (начиная с C++23)
template< class U = T >
constexpr expected& operator=( U&& v );
(3) (начиная с C++23)
(T не является cv void)
template< class G >
constexpr expected& operator=( const unexpected<G>& other );
(4) (начиная с C++23)
template< class G >
constexpr expected& operator=( unexpected<G>&& other );
(5) (начиная с C++23)

Присваивает новое значение существующему объекту expected.

1,2) Присваивает состояние other.
  • Если this->has_value() равно other.has_value(), присваивается значение, содержащееся в other. Ничего не делает, если T равно (возможно, cv-квалифицированному) void и other.has_value() равно true.
  • Иначе уничтожает текущее содержащееся значение (ничего не делает, если this->has_value() равно true, а T равно (возможно cv-квалифицированному) void), и создаёт *this, содержащий копию значения, содержащегося в other.
Если other.has_value() равно true, а T равно (возможно cv-квалифицированному) void, новое значение не создаётся. Иначе новое значение создаётся копированием (1) или перемещением (2) из *other или other.error(), соответственно. Если генерируется исключение, старое значение сохраняется; *this не остаётся без значения.

Если исключение не было сгенерировано, после присваивания has_value() равно other.has_value().

3) Присваивает из ожидаемого значения.
  • Если this->has_value() равно true, эквивалентно **this = std::forward<U>(v).
  • Иначе уничтожает значение, содержащееся в *this, и делает *this содержащим значение, инициализированное из std::forward<U>(v). Если генерируется исключение, старое значение сохраняется; *this не остаётся без значения.

Если исключение не было сгенерировано, после присваивания this->has_value() становится равным true.

4,5) Присваивает из неожидаемого значения.

Пусть GF будет const G& для перегрузки (4), и G для перегрузки (5).

  • Если this->has_value() равно true, уничтожает значение, содержащееся в *this (ничего не делает, если T равно (возможно cv-квалифицированному) void), и заставляет *this содержать значение, инициализированное из std::forward<GF>(e.error()). Если генерируется исключение, старое значение сохраняется; *this не остаётся без значения.
  • Иначе эквивалентно this->error() = std::forward<GF>(e.error()).

Если исключение не было выдано, после присваивания this->has_value() становится равным false.


Во всех случаях, если T не является (возможно, cv-квалифицированным) void, уничтожение старого значения и создание нового значения выполняется, как если бы следующей функцией только для пояснения reinit_expected.

template< class NewType, class OldType, class... Args >
constexpr void reinit_expected( NewType& new_val, OldType& old_val, Args&&... args ) {
    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)...);
    } 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));
    } 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;
        }
    }
}

Содержание

[править] Параметры

other другой объект expected, содержащий значение для присваивания
value значение для присваивания содержащемуся значению
e объект std::unexpected содержащий значение для присваивания

[править] Возвращаемое значение

*this

[править] Исключения

1) Генерирует любое исключение, созданное конструктором копирования или оператором копирования T или E.
2) Если T является (возможно, cv-квалифицированным) void, Иначе,
3) Генерирует любое исключение, созданное конструктором или оператором присваивания T.
4,5) Генерирует любое исключение, созданное конструктором или оператором присваивания E.

[править] Пример

[править] Смотрите также

создаёт ожидаемое значение на месте
(public функция-элемент) [править]