# 标准库头文件 <optional>

< cpp‎ | header

### 包含
<compare> (C++20) | 三路比较运算符支持
### 类
optional (C++17) | 可能或可能不保有一个对象的包装器 (类模板)
bad_optional_access (C++17) | 指示进行了到不含值的 `optional` 的有检查访问的异常 (类)
std::hash<std::optional> (C++17) | 特化 std::hash 算法 (类模板特化)
nullopt_t (C++17) | 带未初始化状态的 `optional` 类型的指示器 (类)
##### 前置声明
定义于头文件 `<functional>`
hash (C++11) | 散列函数对象 (类模板)
### 常量
nullopt (C++17) | `nullopt_t` 类型对象 (常量)
### 函数
##### 比较
operator==operator!=operator<operator<=operator>operator>=operator<=> (C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20) | 比较 `optional` 对象 (函数模板)
##### 特化的算法
std::swap(std::optional) (C++17) | 特化 std::swap 算法 (函数模板)
make_optional (C++17) | 创建一个 `optional` 对象 (函数模板)

### 概要

    #include <compare>

    namespace std {
      // 类模板 optional
      template<class T>
        class optional;

      // 无值状态指示器
      struct nullopt_t{/* 见描述 */};
      inline constexpr nullopt_t nullopt(/* 未指明 */);

      // 类 bad_optional_access
      class bad_optional_access;

      // 关系运算符
      template<class T, class U>
        constexpr bool operator==(const optional<T>&, const optional<U>&);
      template<class T, class U>
        constexpr bool operator!=(const optional<T>&, const optional<U>&);
      template<class T, class U>
        constexpr bool operator<(const optional<T>&, const optional<U>&);
      template<class T, class U>
        constexpr bool operator>(const optional<T>&, const optional<U>&);
      template<class T, class U>
        constexpr bool operator<=(const optional<T>&, const optional<U>&);
      template<class T, class U>
        constexpr bool operator>=(const optional<T>&, const optional<U>&);
      template<class T, three_way_comparable_with<T> U>
        constexpr compare_three_way_result_t<T,U>
          operator<=>(const optional<T>&, const optional<U>&);

      // 与 nullopt 比较
      template<class T> constexpr bool operator==(const optional<T>&, nullopt_t) noexcept;
      template<class T>
        constexpr strong_ordering operator<=>(const optional<T>&, nullopt_t) noexcept;

      // 与 T 比较
      template<class T, class U> constexpr bool operator==(const optional<T>&, const U&);
      template<class T, class U> constexpr bool operator==(const T&, const optional<U>&);
      template<class T, class U> constexpr bool operator!=(const optional<T>&, const U&);
      template<class T, class U> constexpr bool operator!=(const T&, const optional<U>&);
      template<class T, class U> constexpr bool operator<(const optional<T>&, const U&);
      template<class T, class U> constexpr bool operator<(const T&, const optional<U>&);
      template<class T, class U> constexpr bool operator>(const optional<T>&, const U&);
      template<class T, class U> constexpr bool operator>(const T&, const optional<U>&);
      template<class T, class U> constexpr bool operator<=(const optional<T>&, const U&);
      template<class T, class U> constexpr bool operator<=(const T&, const optional<U>&);
      template<class T, class U> constexpr bool operator>=(const optional<T>&, const U&);
      template<class T, class U> constexpr bool operator>=(const T&, const optional<U>&);
      template<class T, three_way_comparable_with<T> U>
        constexpr compare_three_way_result_t<T,U>
          operator<=>(const optional<T>&, const U&);

      // 特化的算法
      template<class T>
        constexpr void swap(optional<T>&, optional<T>&) noexcept(/* 见描述 */);

      template<class T>
        constexpr optional</* 见描述 */> make_optional(T&&);
      template<class T, class... Args>
        constexpr optional<T> make_optional(Args&&... args);
      template<class T, class U, class... Args>
        constexpr optional<T> make_optional(initializer_list<U> il, Args&&... args);

      // 散列支持
      template<class T> struct hash;
      template<class T> struct hash<optional<T>>;
    }

#### 类模板 std::optional

    namespace std {
      template<class T>
      class optional {
      public:
        using value_type = T;

        // 构造函数
        constexpr optional() noexcept;
        constexpr optional(nullopt_t) noexcept;
        constexpr optional(const optional&);
        constexpr optional(optional&&) noexcept(/* 见描述 */);
        template<class... Args>
          constexpr explicit optional(in_place_t, Args&&...);
        template<class U, class... Args>
          constexpr explicit optional(in_place_t, initializer_list<U>, Args&&...);
        template<class U = T>
          constexpr explicit(/* 见描述 */) optional(U&&);
        template<class U>
          constexpr explicit(/* 见描述 */) optional(const optional<U>&);
        template<class U>
          constexpr explicit(/* 见描述 */) optional(optional<U>&&);

        // 析构函数
        constexpr ~optional();

        // 赋值
        constexpr optional& operator=(nullopt_t) noexcept;
        constexpr optional& operator=(const optional&);
        constexpr optional& operator=(optional&&) noexcept(/* 见描述 */);
        template<class U = T> constexpr optional& operator=(U&&);
        template<class U> constexpr optional& operator=(const optional<U>&);
        template<class U> constexpr optional& operator=(optional<U>&&);
        template<class... Args> constexpr T& emplace(Args&&...);
        template<class U, class... Args> constexpr T& emplace(initializer_list<U>, Args&&...);

        // 交换
        constexpr void swap(optional&) noexcept(/* 见描述 */);

        // 观察器
        constexpr const T* operator->() const noexcept;
        constexpr T* operator->() noexcept;
        constexpr const T& operator*() const& noexcept;
        constexpr T& operator*() & noexcept;
        constexpr T&& operator*() && noexcept;
        constexpr const T&& operator*() const&& noexcept;
        constexpr explicit operator bool() const noexcept;
        constexpr bool has_value() const noexcept;
        constexpr const T& value() const&;
        constexpr T& value() &;
        constexpr T&& value() &&;
        constexpr const T&& value() const&&;
        template<class U> constexpr T value_or(U&&) const&;
        template<class U> constexpr T value_or(U&&) &&;

        // 单子操作
        template <class F> constexpr auto and_then(F&& f) &;
        template <class F> constexpr auto and_then(F&& f) &&;
        template <class F> constexpr auto and_then(F&& f) const&;
        template <class F> constexpr auto and_then(F&& f) const&&;
        template <class F> constexpr auto transform(F&& f) &;
        template <class F> constexpr auto transform(F&& f) &&;
        template <class F> constexpr auto transform(F&& f) const&;
        template <class F> constexpr auto transform(F&& f) const&&;
        template <class F> constexpr optional or_else(F&& f) &&;
        template <class F> constexpr optional or_else(F&& f) const&;

        // 修改器
        constexpr void reset() noexcept;

      private:
        T *val;         // 仅用于阐释
      };

      template<class T>
        optional(T) -> optional<T>;
    }