C++std::map命名需求分配器感知容器
目前我正在尝试将 C++ 的一些命名要求转换为 C++20 概念(https://godbolt.org/z/EdY5d6319仍然高度 WIP!)。然而,我偶然发现了一个问题。
鉴于最终的 C++20 工作草案(http://open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4861.pdf):
- 第 790 页:对分配器感知容器的要求:
给定一个具有 value_type T 的分配器感知容器 X,需要表达式a == twherea表示类型 X 的非常量左值和类型 Xt的左值或常量右值。
先决条件: T 是 Cpp17CopyInsertable 到 X 和Cpp17CopyAssignable。
-> 因此,X::value_type必须是 CopyAssignable。 - 第 699 页
is_copy_assignable::
“对于可引用类型 T,结果与 相同is_assignable_v<T&, const T&>,否则为false。” - 第 849 页
std::map::
“映射满足容器、可逆容器(22.2)、关联容器(22.2.6)和分配器感知容器(表 76)的所有要求。”
因此std::map<Key, T>满足分配器感知容器的要求。因此,std::map<Key, T>::value_type必须是 CopyAssignable。但是,std::map<Key, T>::value_type被定义为std::pair<const Key, T>,由于beeing ,它不是CopyAssignable 。因此,不满足分配器感知容器要求,这与标准草案中的第 849 页相矛盾。Keyconststd::map
我在这里想念什么?
回答
在[containers.associative.reqmts]/7 中有一个明确的解决方案:
关联容器满足分配器感知容器的所有要求,但对于
map和multimap,放置在要求value_type在表76,而不是适用于key_type和mapped_type。[注意:例如,在某些情况下key_type,即使关联的,不是,mapped_type也需要和。— 尾注 ]Cpp17CopyAssignablevalue_typepair<const key_type, mapped_type>Cpp17CopyAssignable
- @Arkantos493: Don't feel bad; it's really hard to track STL stuff down in the standard. For any given container, there are at least 3 different places you might have to look to find something out about its behavior. Because repetition would be bad.