atomic_ref<cv T>
is not well-specifiedSection: 32.5.7.1 [atomics.ref.generic.general] Status: Open Submitter: Casey Carter Opened: 2020-12-02 Last modified: 2024-06-28
Priority: 2
View all issues with Open status.
Discussion:
atomic_ref<T>
requires only that its template parameter T
is trivially copyable,
which is not sufficient to implement many of the class template's member functions. Consider, for example:
int main() { static const int x = 42; std::atomic_ref<const int> meow{x}; meow.store(0); return meow.load(); }
Since const int
is trivially copyable, this is a well-formed C++20 program that returns 0
.
That said, the store
call that mutates the value of a constant object is (a) not implementable with
library technology, and (b) pure madness that violates the language semantics. atomic_ref::store
should presumably require is_copy_assignable_v<T>
, and other operations need to have their
requirements audited as well. (Related: LWG 3012 made similar changes to atomic
.)
volatile atomic<T>
recently had its member functions deprecated when they
are not lock-free. Presumably atomic_ref<volatile T>
should require that atomic operations on
T
be lock-free for consistency.
Jonathan:
The last point is related to LWG 3417 (another case where we screwed up the volatile
deprecations).
[2020-12-19; Reflector prioritization]
Set priority to 2 during reflector discussions.
[2024-06; Related to issue 4069.]
[St. Louis 2024-06-28; SG1 feedback]
SG1 forwarded P3323R0 to LEWG to resolve LWG issues 3508 and 4069.
Proposed resolution: