为什么都订std::map而订std::set不请订transaction_safe?
Why are ordered std::map and ordered std::set not invited to make transaction_safe?
众所周知,实验性 C++ 中有事务内存 TS (ISO/IEC TS 19841:2015):
和 operator[]
声明为 transaction_safe
仅适用于容器:std::vector
、std::unordered_map
、std::unordered_multimap
、std::unordered_set
、std::unordered_multiset
, std::deque
- 取自 n4514: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4514.pdf
23.4 Associative containers [associative]
23.4.4 Class template map [map]
23.4.4.1 Class template map overview [map.overview]
In 23.4.4.1 [map.overview], add "transaction_safe" to the declarations
of all variants of the begin and end member functions and to the
declarations of size, max_size, and empty.
但是为什么 operator[]
没有被声明为 transaction_safe
用于 std::map
和 std::set
(但是有用于 unordered_map
/unordered_set
)?
为什么 begin
和 end
成员函数的所有变体声明中都添加了 "transaction_safe" std::map
和 std::set
?
迭代器 begin
和 end
对于 std::array
、std::vector
或 std::list
非常必要,但对于关联数组则不是。在关联数组中需要查找或查找并修改函数:find
、at
、insert
、erase
和 operator[]
。没有它们,就没有意义。
为什么都订std::map而订std::set不请transaction_safe?
unordered_meow::operator[]
被指定为无条件事务安全是一个缺陷。
- 首先,
unordered_set
、unordered_multiset
和 unordered_multimap
一开始甚至没有 operator[]
。
unordered_map::operator[]
必须调用Hash
和Pred
,并可能分配内存并构造新的键值对; none 其中必然是交易安全的。
相反,map::operator[]
的事务安全性受 [container.requirements.general] 的补充约束:
Unless unconditionally specified to be transaction-safe, a function in
this Clause is transaction-safe if all required operations are
transaction-safe. [ Note: This includes operations on the element
type, on std::allocator_traits
, and on Compare
, Pred
, or Hash
objects,
depending on the respective function. -- end note ]
众所周知,实验性 C++ 中有事务内存 TS (ISO/IEC TS 19841:2015):
和 operator[]
声明为 transaction_safe
仅适用于容器:std::vector
、std::unordered_map
、std::unordered_multimap
、std::unordered_set
、std::unordered_multiset
, std::deque
- 取自 n4514: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4514.pdf
23.4 Associative containers [associative]
23.4.4 Class template map [map]
23.4.4.1 Class template map overview [map.overview]
In 23.4.4.1 [map.overview], add "transaction_safe" to the declarations of all variants of the begin and end member functions and to the declarations of size, max_size, and empty.
但是为什么 operator[]
没有被声明为 transaction_safe
用于 std::map
和 std::set
(但是有用于 unordered_map
/unordered_set
)?
为什么 begin
和 end
成员函数的所有变体声明中都添加了 "transaction_safe" std::map
和 std::set
?
迭代器 begin
和 end
对于 std::array
、std::vector
或 std::list
非常必要,但对于关联数组则不是。在关联数组中需要查找或查找并修改函数:find
、at
、insert
、erase
和 operator[]
。没有它们,就没有意义。
为什么都订std::map而订std::set不请transaction_safe?
unordered_meow::operator[]
被指定为无条件事务安全是一个缺陷。
- 首先,
unordered_set
、unordered_multiset
和unordered_multimap
一开始甚至没有operator[]
。 unordered_map::operator[]
必须调用Hash
和Pred
,并可能分配内存并构造新的键值对; none 其中必然是交易安全的。
相反,map::operator[]
的事务安全性受 [container.requirements.general] 的补充约束:
Unless unconditionally specified to be transaction-safe, a function in this Clause is transaction-safe if all required operations are transaction-safe. [ Note: This includes operations on the element type, on
std::allocator_traits
, and onCompare
,Pred
, orHash
objects, depending on the respective function. -- end note ]