# std::hash <std::optional>

< cpp‎ | utility‎ | optional

定义于头文件 `<optional>` |  |
template<class T> struct hash<std::optional<T>>; |  | (C++17 起)

std::hash 对 std::optional 类的模板特化允许用户获得 `optional` 对象所含值的哈希值。

若启用了 std::hash<std::remove_const_t<T>> ，则启用特化 std::hash<optional<T>> 得到启用，反之禁用它。

在启用时，对于含值的 `std::optional<T>` 类型对象 `o` ， `std::hash<std::optional<T>>()(o)` 求值 std::hash<std::remove_const_t<T>>()(*o) 。对于不容纳值的 `optional` ，哈希值未指定。

此特化的成员函数不保证 `noexcept` ，因为底层类型的哈希可能抛出。

### 模板形参

T | - | `optional` 对象所含值的类型

### 示例

    #include <optional>
    #include <unordered_set>
    #include <string>
    #include <iostream>
    using namespace std::literals;
    int main()
    {
        // hash<optional> 令 unordered_set 可以使用
        std::unordered_set<std::optional<std::string>> s = {
                "abc"s, std::nullopt, "def"s
        };

        for(const auto& o : s)
            std::cout << o.value_or("(null)") << ' ';
    }

可能的输出：

    def abc (null)

### 参阅

hash (C++11) | 散列函数对象 (类模板)