小编Ale*_*iet的帖子

C++ `std::unordered_map` 如何从 `std::pair<const Key, Value>` 转换为 `std::pair<Key, Value>`?

在实现 constexpr 无序映射的过程中,我试图了解std::unordered_map. 我很难理解的一件事是如何std::pair<const Key, Value>std::pair<Key, Value>不复制或移动Key.

看看 GCC 的实现(std::unordered_map, hashtable.h, hashtable_policy.h),据我了解,它在幕后std::unordered_map使用了一个将节点中的项目直接存储为. 然而,当使用 的节点句柄接口时,标准规定键是可修改的(这甚至是使用节点句柄的一种用例,能够更改键而无需移动或复制值):_Hashtablestd::pair<const Key, Value>std::unordered_map

key_type& key() const;
Run Code Online (Sandbox Code Playgroud)

此外,例如在地图上迭代时,需要能够对 进行引用std::pair<const Key, Value>,因此如果将这些对存储为 ,则会出现相同的问题(但以相反的方式)std::pair<Key, Value>

显然,我的第一直觉只是简单地去掉const_castconst,但据我所知,这是未定义的行为,因为原始数据是 const (坦率地说,我什至不知道是否有可能出现在const_cast一对中)。此外,在执行 constexpr 实现的上下文中,const_cast这是不可行的。

为了确保,我还检查了以下内容无法编译:

std::pair<int, int> p{1, 2};
std::pair<const int, int>& pref = p;
Run Code Online (Sandbox Code Playgroud)

如果有人有更多关于如何实现这一点的信息或者熟悉 GCC 的实现,我将非常感激。

c++ language-lawyer c++20

1
推荐指数
1
解决办法
222
查看次数

标签 统计

c++ ×1

c++20 ×1

language-lawyer ×1