为什么在 std::hash 中使用 {} 访问 operator()?

Why is {} used to access operator() in std::hash?

在阅读用于 std::unordered_map 的 std::hash 示例时,我注意到 {} 正在访问 operator() 函数。

http://en.cppreference.com/w/cpp/utility/hash

result_type operator()(argument_type const& s) const
{
    result_type const h1 ( std::hash<std::string>{}(s.first_name) );
    result_type const h2 ( std::hash<std::string>{}(s.last_name) );
    return h1 ^ (h2 << 1); // or use boost::hash_combine (see Discussion)
}

这里的{}代表什么?

std::hash<T> 是类型而不是函数。

std::hash 的一个实例有一个执行散列的 operator()

所以std::hash<std::string>是一种散列类型。 {} 然后创建该类型的实例。 (s.first_name)std::hash<std::string> 上调用 operator()

std::hash<std::string>{}(s.first_name);
^                     ^       ^
|                     |   call operator() on that instance
type of hasher        |
                create an instance of that type

std::hash 不是函数,而是 class,更具体地说是函子。所以你必须先创建一个 class 的对象,然后才能调用它的 operator().