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.但是我仍然无法理解为什么对的移动构造函数在之前被调用插入通话.对此有何帮助?
解决方法
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 aconst &
. 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)}); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。