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;