为什么都订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::vectorstd::unordered_mapstd::unordered_multimapstd::unordered_setstd::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::mapstd::set(但是有用于 unordered_map/unordered_set )?

为什么 beginend 成员函数的所有变体声明中都添加了 "transaction_safe" std::mapstd::set

迭代器 beginend 对于 std::arraystd::vectorstd::list 非常必要,但对于关联数组则不是。在关联数组中需要查找或查找并修改函数:findatinserteraseoperator[]。没有它们,就没有意义。

为什么都订std::map而订std::set不请transaction_safe?

unordered_meow::operator[] 被指定为无条件事务安全是一个缺陷。

  • 首先,unordered_setunordered_multisetunordered_multimap 一开始甚至没有 operator[]
  • unordered_map::operator[]必须调用HashPred,并可能分配内存并构造新的键值对; 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 ]