23 General utilities library [utilities]

23.6 Optional objects [optional]

23.6.3 Class template optional [optional.optional]

23.6.3.3 Assignment [optional.assign]

optional<T>& operator=(nullopt_t) noexcept;

Effects: If *this contains a value, calls val->T​::​~T() to destroy the contained value; otherwise no effect.

Returns: *this.

Postconditions: *this does not contain a value.

optional<T>& operator=(const optional& rhs);

Effects: See Table 35.

Table 35optional​::​operator=(const optional&) effects
*this contains a value*this does not contain a value
rhs contains a value assigns *rhs to the contained value initializes the contained value as if direct-non-list-initializing an object of type T with *rhs
rhs does not contain a value destroys the contained value by calling val->T​::​~T() no effect

Returns: *this.

Postconditions: bool(rhs) == bool(*this).

Remarks: If any exception is thrown, the result of the expression bool(*this) remains unchanged. If an exception is thrown during the call to T's copy constructor, no effect. If an exception is thrown during the call to T's copy assignment, the state of its contained value is as defined by the exception safety guarantee of T's copy assignment. This operator shall be defined as deleted unless is_­copy_­constructible_­v<T> is true and is_­copy_­assignable_­v<T> is true.

optional<T>& operator=(optional&& rhs) noexcept(see below);

Effects: See Table 36. The result of the expression bool(rhs) remains unchanged.

Table 36optional​::​operator=(optional&&) effects
*this contains a value*this does not contain a value
rhs contains a value assigns std​::​move(*rhs) to the contained value initializes the contained value as if direct-non-list-initializing an object of type T with std​::​move(*rhs)
rhs does not contain a value destroys the contained value by calling val->T​::​~T() no effect

Returns: *this.

Postconditions: bool(rhs) == bool(*this).

Remarks: The expression inside noexcept is equivalent to:

is_nothrow_move_assignable_v<T> && is_nothrow_move_constructible_v<T>

If any exception is thrown, the result of the expression bool(*this) remains unchanged. If an exception is thrown during the call to T's move constructor, the state of *rhs.val is determined by the exception safety guarantee of T's move constructor. If an exception is thrown during the call to T's move assignment, the state of *val and *rhs.val is determined by the exception safety guarantee of T's move assignment. This operator shall not participate in overload resolution unless is_­move_­constructible_­v<T> is true and is_­move_­assignable_­v<T> is true.

template <class U = T> optional<T>& operator=(U&& v);

Effects: If *this contains a value, assigns std​::​forward<U>(v) to the contained value; otherwise initializes the contained value as if direct-non-list-initializing object of type T with std​::​forward<U>(v).

Returns: *this.

Postconditions: *this contains a value.

Remarks: If any exception is thrown, the result of the expression bool(*this) remains unchanged. If an exception is thrown during the call to T's constructor, the state of v is determined by the exception safety guarantee of T's constructor. If an exception is thrown during the call to T's assignment, the state of *val and v is determined by the exception safety guarantee of T's assignment. This function shall not participate in overload resolution unless is_­same_­v<optional<T>, decay_­t<U>> is false, conjunction_­v<is_­scalar<T>, is_­same<T, decay_­t<U>>> is false, is_­constructible_­v<T, U> is true, and is_­assignable_­v<T&, U> is true.

template <class U> optional<T>& operator=(const optional<U>& rhs);

Effects: See Table 37.

Table 37optional​::​operator=(const optional<U>&) effects
*this contains a value*this does not contain a value
rhs contains a value assigns *rhs to the contained value initializes the contained value as if direct-non-list-initializing an object of type T with *rhs
rhs does not contain a value destroys the contained value by calling val->T​::​~T() no effect

Returns: *this.

Postconditions: bool(rhs) == bool(*this).

Remarks: If any exception is thrown, the result of the expression bool(*this) remains unchanged. If an exception is thrown during the call to T's constructor, the state of *rhs.val is determined by the exception safety guarantee of T's constructor. If an exception is thrown during the call to T's assignment, the state of *val and *rhs.val is determined by the exception safety guarantee of T's assignment. This function shall not participate in overload resolution unless

  • is_­constructible_­v<T, const U&> is true,

  • is_­assignable_­v<T&, const U&> is true,

  • is_­constructible_­v<T, optional<U>&> is false,

  • is_­constructible_­v<T, optional<U>&&> is false,

  • is_­constructible_­v<T, const optional<U>&> is false,

  • is_­constructible_­v<T, const optional<U>&&> is false,

  • is_­convertible_­v<optional<U>&, T> is false,

  • is_­convertible_­v<optional<U>&&, T> is false,

  • is_­convertible_­v<const optional<U>&, T> is false,

  • is_­convertible_­v<const optional<U>&&, T> is false,

  • is_­assignable_­v<T&, optional<U>&> is false,

  • is_­assignable_­v<T&, optional<U>&&> is false,

  • is_­assignable_­v<T&, const optional<U>&> is false, and

  • is_­assignable_­v<T&, const optional<U>&&> is false.

template <class U> optional<T>& operator=(optional<U>&& rhs);

Effects: See Table 38. The result of the expression bool(rhs) remains unchanged.

Table 38optional​::​operator=(optional<U>&&) effects
*this contains a value*this does not contain a value
rhs contains a value assigns std​::​move(*rhs) to the contained value initializes the contained value as if direct-non-list-initializing an object of type T with std​::​move(*rhs)
rhs does not contain a value destroys the contained value by calling val->T​::​~T() no effect

Returns: *this.

Postconditions: bool(rhs) == bool(*this).

Remarks: If any exception is thrown, the result of the expression bool(*this) remains unchanged. If an exception is thrown during the call to T's constructor, the state of *rhs.val is determined by the exception safety guarantee of T's constructor. If an exception is thrown during the call to T's assignment, the state of *val and *rhs.val is determined by the exception safety guarantee of T's assignment. This function shall not participate in overload resolution unless

  • is_­constructible_­v<T, U> is true,

  • is_­assignable_­v<T&, U> is true,

  • is_­constructible_­v<T, optional<U>&> is false,

  • is_­constructible_­v<T, optional<U>&&> is false,

  • is_­constructible_­v<T, const optional<U>&> is false,

  • is_­constructible_­v<T, const optional<U>&&> is false,

  • is_­convertible_­v<optional<U>&, T> is false,

  • is_­convertible_­v<optional<U>&&, T> is false,

  • is_­convertible_­v<const optional<U>&, T> is false,

  • is_­convertible_­v<const optional<U>&&, T> is false,

  • is_­assignable_­v<T&, optional<U>&> is false,

  • is_­assignable_­v<T&, optional<U>&&> is false,

  • is_­assignable_­v<T&, const optional<U>&> is false, and

  • is_­assignable_­v<T&, const optional<U>&&> is false.

template <class... Args> T& emplace(Args&&... args);

Requires: is_­constructible_­v<T, Args&&...> is true.

Effects: Calls *this = nullopt. Then initializes the contained value as if direct-non-list-initializing an object of type T with the arguments std​::​forward<Args>(args)....

Postconditions: *this contains a value.

Returns: A reference to the new contained value.

Throws: Any exception thrown by the selected constructor of T.

Remarks: If an exception is thrown during the call to T's constructor, *this does not contain a value, and the previous *val (if any) has been destroyed.

template <class U, class... Args> T& emplace(initializer_list<U> il, Args&&... args);

Effects: Calls *this = nullopt. Then initializes the contained value as if direct-non-list-initializing an object of type T with the arguments il, std​::​forward<Args>(args)....

Postconditions: *this contains a value.

Returns: A reference to the new contained value.

Throws: Any exception thrown by the selected constructor of T.

Remarks: If an exception is thrown during the call to T's constructor, *this does not contain a value, and the previous *val (if any) has been destroyed. This function shall not participate in overload resolution unless is_­constructible_­v<T, initializer_­list<U>&, Args&&...> is true.