生成未命名实例的语法
Grammar to make unnamed instance
我正在为 pair < int,int >
密钥制作散列函数。
无论如何,我发现了以下使用 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;
std::hash<T1>()
和 std::hash<T1>{}
都可以,但我不知道为什么会这样。
我什至找不到这方面的参考文章。
我猜他们两个都是字面上对classstd::hash<T1>
做'unnamed temporal instance',然后调用operator()(T1)
方法。对吗?
是的,都构造了临时对象std::hash
,然后在临时对象上调用operator()
。
std::hash<T1>()
执行 value initialization、
1,5) when a nameless temporary object is created with the initializer consisting of an empty pair of parentheses or braces (since C++11)
;
临时文件由默认构造函数初始化。
std::hash<T1>{}
执行 list initialization (C++11 起),
2) initialization of an unnamed temporary with a braced-init-list
作为效果,默认构造函数也value-initialized临时对象。
std::hash<T>
不是 function.You 的类型,可以将其视为 函子 。所以你必须创建它的一个实例。
要回答你的问题,是的,两种方法都创建一个 std::hash<T>
的对象并调用 ()
运算符对其进行初始化。
std::hash<T1>()
使用括号进行初始化。它也被称为值初始化。
std::hash<T1>{}
是用大括号初始化。在 auto h1 = std::hash<T1>{}(key.first);
中,{}
创建了一个 std::hash<T1>
的实例,然后 (key.first)
在您的实例上调用运算符 ()
。这也称为聚合初始化或list initialization.
In C++11 and onward, you can use std::hash{} (ie, braces
instead of parentheses) to build an object.
我正在为 pair < int,int >
密钥制作散列函数。
无论如何,我发现了以下使用 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;
std::hash<T1>()
和 std::hash<T1>{}
都可以,但我不知道为什么会这样。
我什至找不到这方面的参考文章。
我猜他们两个都是字面上对classstd::hash<T1>
做'unnamed temporal instance',然后调用operator()(T1)
方法。对吗?
是的,都构造了临时对象std::hash
,然后在临时对象上调用operator()
。
std::hash<T1>()
执行 value initialization、
1,5) when a nameless temporary object is created with the initializer consisting of an empty pair of parentheses
or braces (since C++11)
;
临时文件由默认构造函数初始化。
std::hash<T1>{}
执行 list initialization (C++11 起),
2) initialization of an unnamed temporary with a braced-init-list
作为效果,默认构造函数也value-initialized临时对象。
std::hash<T>
不是 function.You 的类型,可以将其视为 函子 。所以你必须创建它的一个实例。
要回答你的问题,是的,两种方法都创建一个 std::hash<T>
的对象并调用 ()
运算符对其进行初始化。
std::hash<T1>()
使用括号进行初始化。它也被称为值初始化。
std::hash<T1>{}
是用大括号初始化。在 auto h1 = std::hash<T1>{}(key.first);
中,{}
创建了一个 std::hash<T1>
的实例,然后 (key.first)
在您的实例上调用运算符 ()
。这也称为聚合初始化或list initialization.
In C++11 and onward, you can use std::hash{} (ie, braces instead of parentheses) to build an object.