C++ std::unordered_map如何无拷贝转换两种std::pair类型?
关于constexpr unordered_map中pair<const Key, Value>与pair<Key, Value>转换的问题
我正在实现constexpr版本的std::unordered_map,想搞懂标准库std::unordered_map的内部实现逻辑。目前卡壳的点是:如何在不拷贝或移动Key的前提下,实现std::pair<const Key, Value>和std::pair<Key, Value>之间的转换?
我研究了GCC的实现,发现std::unordered_map底层依赖_Hashtable,直接存储std::pair<const Key, Value>类型的节点。但根据C++标准,std::unordered_map的node handle接口允许修改键(这也是node handle的核心用途之一:无需移动或拷贝值就能修改键),它的接口是:
key_type& key() const;
另外,遍历map时需要获取std::pair<const Key, Value>的引用,如果底层存的是std::pair<Key, Value>,又会遇到反向转换的问题。
我第一反应是用const_cast去掉const属性,但这属于未定义行为,而且在constexpr场景下根本用不了。我还测试了下面的代码,发现编译不通过:
std::pair<int, int> p{1, 2}; std::pair<const int, int>& pref = p;
希望有人能讲讲这个转换的实现方式,或者熟悉GCC具体实现的大佬来解惑。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

