生成未命名实例的语法

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.