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

6

在阅读用于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)
}

这里使用 {} 代表什么意思?

https://dev59.com/3GMl5IYBdhLWcg3wqIdh - François Andrieux
2
我希望C++允许使用static operator() - Daniel H
请仅返回翻译后的文本:如何理解此代码片段中的两对括号? - NathanOliver
1
@DanielH 这基本上就是...返回您选择的类型的构造函数。疯狂。 - Yakk - Adam Nevraumont
@tobi303 举个例子,看看我评论的那个问题就知道这个会有多有用了。如果std::hash被称为std::hash<std::string>(s)而不是带有额外的{},那么使用起来会更容易。你不能进行部分函数特化、lambda特化或重载,但可以进行部分类型特化。 - Daniel H
显示剩余3条评论
2个回答

9

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

@erip 如果我做同样的事情,你会给我一个点赞吗?开玩笑:P 我其实也想画类似的东西,但是我太慢了。 - 463035818_is_not_a_number
1
@tobi303 如果你添加自由手绘制的红色圆圈,我会点赞。 - Yakk - Adam Nevraumont
类模板,而不是类型 :-P - Barry
@barry,这个部分结束于>而不是< - Yakk - Adam Nevraumont
@Yakk 说到你的第一句话。 - Barry
显示剩余2条评论

4

std::hash 不是一个函数,而是一个类,更确切地说是一个函数对象。因此,在调用其 operator() 之前,您必须创建该类的对象。

enter image description here


这真的是手写的吗?:> - W.F.
看起来很随意。可惜我没有说“只有”,所以我已经点赞了。;) 但是+1自由手绘的红圈。 - Yakk - Adam Nevraumont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接