23 General utilities library [utilities]

23.6 Optional objects [optional]

23.6.3 Class template optional [optional.optional]

23.6.3.5 Observers [optional.observe]

constexpr const T* operator->() const; constexpr T* operator->();

Requires: *this содержит значение.

Returns: val.

Throws: Ничего такого.

Remarks: Эти функции должны быть функциями constexpr.

constexpr const T& operator*() const&; constexpr T& operator*() &;

Requires: *this содержит значение.

Returns: *val.

Throws: Ничего такого.

Remarks: Эти функции должны быть функциями constexpr.

constexpr T&& operator*() &&; constexpr const T&& operator*() const&&;

Requires: *this содержит значение.

Effects: Эквивалентен: return std​::​move(*val);

constexpr explicit operator bool() const noexcept;

Returns: true тогда и только тогда, когда *this содержит значение.

Remarks: Эта функция должна быть функцией constexpr.

constexpr bool has_value() const noexcept;

Returns: true тогда и только тогда, когда *this содержит значение.

Remarks: Эта функция должна быть функцией constexpr.

constexpr const T& value() const&; constexpr T& value() &;

Effects: Эквивалентен:

return bool(*this) ? *val : throw bad_optional_access();

constexpr T&& value() &&; constexpr const T&& value() const&&;

Effects: Эквивалентен:

return bool(*this) ? std::move(*val) : throw bad_optional_access();

template <class U> constexpr T value_or(U&& v) const&;

Effects: Эквивалентен:

return bool(*this) ? **this : static_cast<T>(std::forward<U>(v));

Remarks: Если is_­copy_­constructible_­v<T> && is_­convertible_­v<U&&, T> есть false, программа сформирована неправильно.

template <class U> constexpr T value_or(U&& v) &&;

Effects: Эквивалентен:

return bool(*this) ? std::move(**this) : static_cast<T>(std::forward<U>(v));

Remarks: Если is_­move_­constructible_­v<T> && is_­convertible_­v<U&&, T> есть false, программа сформирована неправильно.