Let's consider next snippet:
int val=5;
int& ref=val;
std::atomic<int> atomicref(ref);
atomicref;
std::cout<< "atomic ref="<<atomicref.load()<<" original ref="<<ref<<" original val="<<val;
When I compile it under Mac OS X, XCode 8.3.3, c 11 I receive output like this:
atomic ref=6 original ref=5 original val=5
The line:
std::atomic<int> atomicref(ref);
of course looks suspicious since the type under atomic is not the same as in variable's declaration - it is reference.
I wonder why the values do not match; is it correct to say that atomicref actually creates a copy of val ?
CodePudding user response:
std:atomic with reference type creates copy of underlying variable?
There is no "atomic with reference type" in your code. You merely use a reference to initialize the atomic<int> which holds an int value.
It is not specific to std::atomic and similar to
int x = 42;
int& x_ref = x;
int copy_of_x = x_ref;
copy_of_x is a copy of x not a reference.
CodePudding user response:
atomic_ref class implements atomic references in C 20.
Though according to the standard, you cannot access underlying type during the lifetime of atomic_ref by any means, except by other similar atomic_ref.
So this should work:
alignas(std::atomic_ref<int>::required_alignment) int val=5;
int& ref=val;
{
std::atomic_ref<int> atomicref(val);
atomicref;
std::cout<< "atomic ref="<<atomicref.load();
}
std::cout<< " original ref="<<ref<<" original val="<<val;
But normally you should just use std::atomic instead, and don't access the underlying value.
