# 实验性库头文件 <experimental/optional>

< cpp‎ | header‎ | experimental

此头文件是库基础 TS (v1, v2) 的一部分。

### 类

名字 | 说明
optional (库基础 TS) | 可能或可能不保有一个对象的包装器 (类模板)
bad_optional_access (库基础 TS) | 指示进行了到不含值的 `optional` 的有检查访问的异常 (类)
in_place_t (库基础 TS) | 用于 optional 类型的就地构造的消歧义标签类型 (类)
std::hash<std::experimental::optional> | 特化 std::hash 算法 (类模板特化)
nullopt_t (库基础 TS) | 带未初始化状态的 `optional` 类型的指示器 (类)

### 函数

##### 比较
operator==operator!=operator<operator<=operator>operator>= | 比较 `optional` 对象 (函数模板)
##### 特化的算法
std::swap(std::experimental::optional) | 特化 std::swap 算法 (函数)
make_optional | 创建一个 `optional` 对象 (函数模板)
##### 散列支持

### 概要

    namespace std {
      namespace experimental {
      inline namespace fundamentals_v1 {

        // 5.4，用于对象类型的 optional
        template <class T> class optional;

        // 5.5，就地构造
        struct in_place_t{};
        constexpr in_place_t in_place{};

        // 5.6，无值状态指示器
        struct nullopt_t{see below};
        constexpr nullopt_t nullopt(unspecified);

        // 5.7，类 bad_optional_access
        class bad_optional_access;

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

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

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

        // 5.11，特化的算法
        template <class T> void swap(optional<T>&, optional<T>&) noexcept(see below);
        template <class T> constexpr optional<see below> make_optional(T&&);

      } // namespace fundamentals_v1
      } // namespace experimental

      // 5.12，散列支持
      template <class T> struct hash;
      template <class T> struct hash<experimental::optional<T>>;

    } // namespace std