c – 进一步的右值参考和临时对象

c – 进一步的右值参考和临时对象,第1张

概述在我之前的 question和 question的详细说明中,我想了解这个真实场景中发生了什么.我有以下模板功能: template <typename Key, typename Value, typename HashFunction, typename Equals>void FastHash<Key, Value, HashFunction, Equals>::Insert(const 在我之前的 question和 question的详细说明中,我想了解这个真实场景中发生了什么.我有以下模板功能:

template <typename Key,typename Value,typename HashFunction,typename Equals>voID FastHash<Key,Value,HashFunction,Equals>::Insert(const Key& key,const Value& value){    Insert(std::make_pair(key,value));}

例如,使用左值和右值的混合调用,就像在这个调用中一样:

std::string name = "The Great";hashtable.Insert(name,"Gatsby");

(用于测试目的).插入以上电话

template <typename Key,Equals>::Insert(pair<const Key,Value>&& keyvaluePair){    if (buckets.size() == 0)    {        buckets.resize(1);    }    HashFunction hash;    unsigned long hashValue = hash(keyvaluePair.first) % buckets.size();    buckets[hashValue].push_back(std::move(keyvaluePair));}

几个问题:

1.由于通过引用传递,我期望将其元素之一的字符串作为未定义行为的文字字符串.是这样吗?

2.当我进入make_pair行时,代码首先调用make_pair(_Ty1&& _Val1,_Ty2&& _Val2),因此编译器似乎正在将键和值解释为rvalues.为什么?

3.进入第二个Insert方法之前的下一个调用是pair(pair< _Other1,_Other2>&& _Right).无论第二个插入物是否采用&&和/或或者const&amp ;.这里发生了什么?

如果第二个插入一个const对&还是一对&&,给它做什么?

更新:观看Scott Meyer关于通用引用的优秀视频,阅读模板演绎和参考折叠规则,并在您的帮助下我可以回答1,2和4.但是我仍然无法理解为什么对的移动构造函数在之前被调用插入通话.对此有何帮助?

解决方法

The next call before going into the second Insert method is pair(pair<_Other1,_Other2>&& _Right). This happens irrespective of whether the second Insert takes an && or a const &. What’s going on here?

那是std :: pair的转换构造函数:它正在转换你传递的对 – std :: make_pair(key,value) – 来自std :: pair< Key,Value>到第二个Insert函数的参数类型std :: pair< const Key,Value>.如果您自己指定对类型而不是使用std :: make_pair推导它,则可以避免转换:

Insert(std::pair<const Key,Value>{key,value});

当然,这是将参数复制成一对,而在C 11中我们有经验法则,如果要复制某些东西,你应该按值接受它.所以也许实现这个插入:

template <typename Key,Equals>::Insert(Key key,Value value){    Insert(std::pair<const Key,Value>{std::move(key),std::move(value)});}
总结

以上是内存溢出为你收集整理的c – 进一步的右值参考和临时对象全部内容,希望文章能够帮你解决c – 进一步的右值参考和临时对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1227011.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存