Spec-Zone.ru › C++

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

constexpr expected& operator=( const expected& other );
(1) (с C++23)
constexpr expected& operator=( expected&& other ) noexcept(/*see below*/);
(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().

  • Перегрузка (1) определена как удалённая, если
    • либо T является (возможно, с квалификатором cv) void, либо std::is_copy_assignable_v<T> равно true, и
    • либо T является (возможно, с квалификатором cv) void, либо std::is_copy_constructible_v<T> равно true, и
    • std::is_copy_assignable_v<E> равно true, и
    • std::is_copy_constructible_v<E> равно true, и
    • по крайней мере одно из следующего является true:
      • T является (возможно, с квалификатором cv) void
      • std::is_nothrow_move_constructible_v<T>
      • std::is_nothrow_move_constructible_v<E>
  • Перегрузка (2) участвует в разрешении перегрузки только если
    • либо T является (возможно, с квалификатором cv) void, либо std::is_move_assignable_v<T> равно true, и
    • либо T является (возможно, с квалификатором cv) void, либо std::is_move_constructible_v<T> равно true, и
    • std::is_move_assignable_v<E> равно true, и
    • std::is_move_constructible_v<E> равно true, и
    • по крайней мере одно из следующего является true:
      • T является (возможно, с квалификатором cv) void
      • std::is_nothrow_move_constructible_v<T>
      • std::is_nothrow_move_constructible_v<E>
3) Присваивание из значения expected.
  • Если this->has_value() равно true, эквивалентно **this = std::forward<U>(v).
  • В противном случае, уничтожает значение, содержащееся в *this, и заставляет *this содержать значение, инициализированное из std::forward<U>(v). Если возникает исключение, старое значение сохраняется; *this не становится бесзначным.

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

  • Эта перегрузка участвует в разрешении перегрузки только если
    • std::is_same_v<expected, std::remove_cvref_t<U>> ложно, и
    • std::remove_cvref_t<U> не является специализацией std::unexpected, и
    • std::is_constructible_v<T, U> равно true, и
    • std::is_assignable_v<T&, U> равно true, и
    • по крайней мере одно из следующего является true:
      • std::is_nothrow_constructible_v<T, U>
      • std::is_nothrow_move_constructible_v<T>
      • std::is_nothrow_move_constructible_v<E>
4,5) Присваивание из значения unexpected.

Пусть 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.

  • Эта перегрузка участвует в разрешении перегрузки только если
    • std::is_constructible_v<E, GF> равно true, и
    • std::is_assignable_v<E&, GF> равно true, и
    • по крайней мере одно из следующего является true:
      • T является (возможно, с квалификатором cv) void
      • std::is_nothrow_constructible_v<E, GF>
      • std::is_nothrow_move_constructible_v<T>
      • std::is_nothrow_move_constructible_v<E>


Во всех случаях, если 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,
noexcept спецификация:
noexcept(std::is_nothrow_move_constructible_v<E> && std::is_nothrow_move_assignable_v<E>)
Иначе,
noexcept спецификация:
noexcept(

std::is_nothrow_move_constructible_v<T> && std::is_nothrow_move_assignable_v<T> &&
std::is_nothrow_move_constructible_v

<E> && std::is_nothrow_move_assignable_v<E>)
3) Бросает любое исключение, сгенерированное конструктором или оператором присваивания T.
4,5) Бросает любое исключение, сгенерированное конструктором или оператором присваивания E.

Пример

См. также

emplace
создаёт значение expected на месте
(публичный член-функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/expected/operator%3D

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API