语法使未命名的实例

问题描述 投票:0回答:1

我正在为 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>{} 都可以,但我不知道为什么会这样。

我甚至找不到这方面的参考文章。

我猜他们两个都为类做了字面意义上的 "未命名的时间实例"。std::hash<T1>,并调用 operator()(T1) 方法。这样做对吗?

c++ hash instance
1个回答
1
投票

是,两者都是临时建造 std::hash 然后叫 operator() 的临时对象上。

std::hash<T1>() 执行 值初始化,

1,5),当创建一个无名临时对象时,初始化器由一对空括号组成。or braces (since C++11);

暂时由默认构造函数初始化。

std::hash<T1>{} 执行 列表初始化 (自C++11起)。

2)初始化一个未命名的临时机构,并使用 支撑-初始列表

作为效果的暂时也是 初始化 的默认构造函数。


0
投票

std::hash<T> 是一个类型而不是一个函数.你可以把它看成是一个 向量. 所以你必须创建一个它的实例。

回答你的问题,是的,这两种方式都可以使一个对象的 std::hash<T> 并初始化它,调用 () 操作符。

std::hash<T1>() 使用括号进行初始化。它也被称为 值初始化.

std::hash<T1>{} 是使用大括号进行初始化。在 auto h1 = std::hash<T1>{}(key.first); 事实是 {} 的实例,创建一个 std::hash<T1> 然后 (key.first) 话务员 () 在你的实例上。这也就是所谓的 集合初始化列表初始化.

在C++11及以后的版本中,你可以使用std::hash{}。(即用大括号代替括号)来建立一个对象。

© www.soinside.com 2019 - 2024. All rights reserved.