C++ std::map 命名需求分配器感知容器
C++ std::map named requirements allocator-aware container
目前我正在尝试将一些 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 == t
其中 a
表示类型 X 的非常量左值和 t
类型 X 的左值或常量右值是必须的。
先决条件: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),以及 分配器感知容器 (Table 76)。
所以std::map<Key, T>
满足分配器感知容器的要求。因此,std::map<Key, T>::value_type
必须是 CopyAssignable。
但是,std::map<Key, T>::value_type
被定义为 std::pair<const Key, T>
,由于 Key
蜂鸣 const
,因此 不是 CopyAssignable。
因此,std::map
不符合分配器感知容器要求,这与标准草案中的第 849 页相矛盾。
我在这里想念什么?
在 [containers.associative.reqmts]/7 中对这种情况有明确的划分:
The associative containers meet all the requirements of Allocator-aware containers, except that for map
and multimap
, the requirements placed on value_type
in Table 76 apply instead to key_type
and mapped_type
. [ Note: For example, in some cases key_type
and mapped_type
are required to be Cpp17CopyAssignable
even though the associated value_type
, pair<const key_type, mapped_type>
, is not Cpp17CopyAssignable
. — end note ]
目前我正在尝试将一些 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 == t
其中a
表示类型 X 的非常量左值和t
类型 X 的左值或常量右值是必须的。
先决条件: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),以及 分配器感知容器 (Table 76)。
所以std::map<Key, T>
满足分配器感知容器的要求。因此,std::map<Key, T>::value_type
必须是 CopyAssignable。
但是,std::map<Key, T>::value_type
被定义为 std::pair<const Key, T>
,由于 Key
蜂鸣 const
,因此 不是 CopyAssignable。
因此,std::map
不符合分配器感知容器要求,这与标准草案中的第 849 页相矛盾。
我在这里想念什么?
在 [containers.associative.reqmts]/7 中对这种情况有明确的划分:
The associative containers meet all the requirements of Allocator-aware containers, except that for
map
andmultimap
, the requirements placed onvalue_type
in Table 76 apply instead tokey_type
andmapped_type
. [ Note: For example, in some caseskey_type
andmapped_type
are required to beCpp17CopyAssignable
even though the associatedvalue_type
,pair<const key_type, mapped_type>
, is notCpp17CopyAssignable
. — end note ]