命名空间
变体
操作

std::atomic_ref<T>::operator+=,-=

来自 cppreference.cn
< cpp‎ | atomic‎ | atomic_ref
 
 
并发支持库
线程
(C++11)
(C++20)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
协同取消
互斥
(C++11)
通用锁管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件变量
(C++11)
信号量
门闩和屏障
(C++20)
(C++20)
期值
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
危险指针
原子类型
(C++11)
(C++20)
原子类型的初始化
(C++11)(C++20 中已弃用)
(C++11)(C++20 中已弃用)
内存排序
(C++11)(C++26 中已弃用)
原子操作的自由函数
原子标志的自由函数
 
 
仅当 T 是除 cv bool 之外的算术类型或对象指针类型时提供
value_type operator+=( difference_type arg ) const noexcept;
(1) (C++26 起为 constexpr)
value_type operator-=( difference_type arg ) const noexcept;
(2) (C++26 起为 constexpr)

原子地将 *ptr 所引用的当前值替换为前一个值与 arg 参与计算的结果。这些操作是读-修改-写操作。

1) operator+= 执行原子加法。等价于 return fetch_add(arg) + arg;
2) operator-= 执行原子减法。等价于 return fetch_sub(arg) - arg;
  • 对于有符号整数类型,算术运算定义为使用二的补码表示。没有未定义的结果。
  • 对于浮点类型,生效的浮点环境可能不同于调用线程的浮点环境。该操作不必符合对应的 std::numeric_limits 特征,但鼓励这样做。如果结果不是其类型可表示的值,则结果未指定,但操作本身没有未定义行为。
  • 对于指针类型,结果可能是未定义地址,但操作否则没有未定义行为。

这些重载仅当 std::is_const_v<T>false 时才参与重载决议。

目录

[编辑] 参数

arg - 算术操作的参数

[编辑] 返回值

结果值(即,将对应的二元操作符应用于紧接在对应成员函数效果之前由 *ptr 引用的值的结果)。

[编辑] 注意

与大多数复合赋值运算符不同,`atomic_ref` 的复合赋值运算符返回存储值的副本,而不是对 arg 的引用。

[编辑] 示例

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 3508
(P3323R1)
C++20 复合赋值运算符对于 const T 是无意义的 限制为只接受非 const T

[编辑] 参阅

原子地将参数添加到被引用对象中存储的值,并获取先前持有的值
(public member function) [编辑]
原子地从被引用对象中存储的值中减去参数,并获取先前持有的值
(public member function) [编辑]
原子地将引用对象递增或递减一
(public member function) [编辑]
原子地对引用值执行按位与、或、异或
(public member function) [编辑]