Ale*_*iet 1 c++ language-lawyer c++20
在实现 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++ 中没有办法做这些函数所做的事情。然而,因为它们是 C++ 标准库的一部分,所以它们可以作弊。他们可以依靠特定于实现的行为来完成 C++ 标准的要求。
您也可以依赖这些东西,但是如果实现发生变化或者您使用不同的编译器,您的程序的行为将是未定义的并且可能会发生变化。
| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |