C++ 生成未命名实例的语法
我正在为C++ 生成未命名实例的语法,c++,hash,initialization,instance,temporary,C++,Hash,Initialization,Instance,Temporary,我正在为pair键创建哈希函数 无论如何,我发现以下实现使用了std::hash: typedef结构哈希器{ 模板 大小\u t运算符()(常数对和键)常数{ //T1、T2的标准哈希器 auto h1=std::hash()(key.first);//也可以 auto h2=std::hash()(key.second);//也可以 /* autoh1=std::hash{}(key.first); autoh2=std::hash{}(key.second); */ 返回h1^(h2-1)
pair
键创建哈希函数
无论如何,我发现以下实现使用了std::hash
:
typedef结构哈希器{
模板
大小\u t运算符()(常数对和键)常数{
//T1、T2的标准哈希器
auto h1=std::hash()(key.first);//也可以
auto h2=std::hash()(key.second);//也可以
/*
autoh1=std::hash{}(key.first);
autoh2=std::hash{}(key.second);
*/
返回h1^(h2-1);
}
}哈舍;
std::hash()
和std::hash{}
这两种方法都有效,但我不知道为什么会有效
我甚至找不到这方面的参考文章
我猜这两个函数都为class
std::hash
创建了字面上的“未命名的时态实例”,并调用操作符()(T1)
方法。是吗?是的,两者都构造临时std::hash
,然后对临时对象调用operator()
std::hash()
performes
1,5)当使用由一对空括号或大括号组成的初始值设定项创建无名临时对象时(自C++11以来)
临时构造函数由默认构造函数初始化
std::hash{}
performes(从C++11开始)
2) 初始化带有大括号初始化列表的未命名临时文件
作为临时结果,也是默认构造函数。
<代码> STD::hash 是一个非函数的类型。可以将其视为<强>函子< /强>。因此,您必须创建它的一个实例
要回答您的问题,是的,两种方法都将对象设为std::hash
,并调用()
操作符初始化它
std::hash()
使用括号进行初始化。它也称为值初始化
std::hash{}
是使用大括号初始化的。在autoh1=std::hash{}(key.first)中代码>所发生的是{}
创建std::hash
的实例,然后(key.first)
对实例调用操作符()
。这也称为聚合初始化
在C++11及以后的版本中,可以使用std::hash{}(即大括号)
而不是括号)来构建对象
typedef struct hasher_t {
template <class T1, class T2>
size_t operator()(const pair<T1,T2>& key) const {
//standard hasher for T1, T2
auto h1 = std::hash<T1>()(key.first); //also possible
auto h2 = std::hash<T2>()(key.second); //also possible
/*
auto h1 = std::hash<T1>{}(key.first);
auto h2 = std::hash<T2>{}(key.second);
*/
return h1 ^ (h2 - 1);
}
} hasher;