c – 进一步的右值参考和临时对象
在我之前的
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& ;.这里发生了什么? 如果第二个插入一个const对&还是一对&&,给它做什么? 更新:观看Scott Meyer关于通用引用的优秀视频,阅读模板演绎和参考折叠规则,并在您的帮助下我可以回答1,2和4.但是我仍然无法理解为什么对的移动构造函数在之前被调用插入通话.对此有何帮助? 解决方法
那是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)}); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |