|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
(C++20) | ||||
(C++20) | ||||
(C++20) | ||||
| Constants | ||||
(C++17) | ||||
| Specialized member functions | ||||
| Specialized for integral, floating-point(C++20) and pointer types | ||||
atomic::operator+=atomic::operator-= | ||||
| Specialized for integral and pointer types only | ||||
(C++26) | ||||
(C++26) | ||||
| Specialized for integral types only | ||||
member only of atomic<Integral > specializationsand atomic<Floating > specializations(since C++20) | ||
T operator+=( T arg)noexcept; | (1) | (since C++11) |
T operator+=( T arg)volatilenoexcept; | (2) | (since C++11) |
T operator-=( T arg)noexcept; | (3) | (since C++11) |
T operator-=( T arg)volatilenoexcept; | (4) | (since C++11) |
member only of atomic<T*> partial specialization | ||
T* operator+=(std::ptrdiff_t arg)noexcept; | (5) | (since C++11) |
T* operator+=(std::ptrdiff_t arg)volatilenoexcept; | (6) | (since C++11) |
T* operator-=(std::ptrdiff_t arg)noexcept; | (7) | (since C++11) |
T* operator-=(std::ptrdiff_t arg)volatilenoexcept; | (8) | (since C++11) |
Atomically replaces the current value with the result of computation involving the previous value andarg. The operation is read-modify-write operation.
For floating-point types, thefloating-point environment in effect may be different from the calling thread's floating-point environment. The operation need not be conform to the correspondingstd::numeric_limits traits but is encouraged to do so. If the result is not a representable value for its type, the result is unspecified but the operation otherwise has no undefined behavior. | (since C++20) |
T is not a complete object type, the program is ill-formed.It is deprecated ifstd::atomic<T>::is_always_lock_free isfalse and anyvolatile overload participates in overload resolution. | (since C++20) |
Contents |
| arg | - | the argument for the arithmetic operation |
The resulting value (that is, the result of applying the corresponding binary operator to the value immediately preceding the effects of the corresponding member function in themodification order of*this).
Unlike most compound assignment operators, the compound assignment operators for atomic types do not return a reference to their left-hand arguments. They return a copy of the stored value instead.
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| P0558R1 | C++11 | arithmetic permitted on pointers to (possibly cv-qualified)void or function | made ill-formed |
| atomically adds the argument to the value stored in the atomic object and obtains the value held previously (public member function)[edit] | |
| atomically subtracts the argument from the value stored in the atomic object and obtains the value held previously (public member function)[edit] | |
| increments or decrements the atomic value by one (public member function)[edit] | |
| performs bitwise AND, OR, XOR with the atomic value (public member function)[edit] |