似乎与成员函数不同,您无法指定要使用的 memory_order,因此最终可能会使用一些“默认值”。
问问题
234 次
2 回答
7
默认为“顺序一致”。
于 2012-07-21T16:34:10.313 回答
6
根据 C++ 标准(§29.7/35),调用具有非原子基类型的原子类型的效果,即以下之一:operator++
A
C
C A::operator++() volatile noexcept;
C A::operator++() noexcept;
与调用成员函数相同fetch_add(1)
,根据§29.5(初始声明),后者使用默认参数声明:
C fetch_add(C, memory_order = memory_order_seq_cst) volatile noexcept;
C fetch_add(C, memory_order = memory_order_seq_cst) noexcept;
对于整数类型C
,并且:
C* fetch_add(ptrdiff_t, memory_order = memory_order_seq_cst) volatile noexcept;
C* fetch_add(ptrdiff_t, memory_order = memory_order_seq_cst) noexcept;
对于地址类型。换句话说,使用的默认内存顺序operator++
是memory_order_seq_cst
.
标准没有对 做出任何这样的陈述operator+=
,尽管在这种情况下假设什么是正确的operator++
也是正确的似乎很自然operator+=
。
还要注意标准定义的原子类型函数的一般规则:
(§29.6.5/2)[...] 不以结尾的自由函数
_explicit
的语义与它们对应_explicit
的 memory_order 参数的memory_order_seq_cst
.
于 2012-07-23T02:26:00.397 回答