C++ 为什么std::atomic<;T>;::运算符=是否应返回值而不是引用?

C++ 为什么std::atomic<;T>;::运算符=是否应返回值而不是引用?,c++,concurrency,atomic,C++,Concurrency,Atomic,在c中使用原子类型时++ 为什么std::atomic::operator=应该返回值而不是引用? 它不像其他常见的赋值运算符那样返回引用 从网站上我可以得到一些提示 与大多数赋值运算符不同,原子类型的赋值运算符不返回对其左参数的引用。它们返回存储值的副本 我可以猜,如果我使用引用,它就有原子问题。 但我不完全清楚 您有任何异步错误案例的例子吗 如果我返回一个值而不是一个引用,为什么异步错误消失了 您有任何异步错误案例的例子吗 该运算符的返回类型为T。如果是T&,您可以执行以下操作: atomi

在c中使用原子类型时++

为什么std::atomic::operator=应该返回值而不是引用? 它不像其他常见的赋值运算符那样返回引用

从网站上我可以得到一些提示

与大多数赋值运算符不同,原子类型的赋值运算符不返回对其左参数的引用。它们返回存储值的副本

我可以猜,如果我使用引用,它就有原子问题。 但我不完全清楚

您有任何异步错误案例的例子吗

如果我返回一个值而不是一个引用,为什么异步错误消失了

您有任何异步错误案例的例子吗

该运算符的返回类型为
T
。如果是
T&
,您可以执行以下操作:

atomic<int> i;
++(i = 10);
原子i;
++(i=10);
++
将是非原子读增量写,这是非常错误的

如果我返回一个值而不是一个引用,为什么异步错误消失了


因为它返回的是一个副本,而不是一个引用,所以您不能执行我在上面显示的操作。

操作符=有一个返回值,用于在一行中允许多个赋值:

Object a, b;
// Short form
a = b = <value>;
// Equivalent long form
a = <value>;
b = <value>;
b=5
返回类型
std::atomic&
,其中一个无法赋值 与该类型对应的原子变量a,因为对应的
运算符=
被标记为已删除(禁止将一个原子变量分配给另一个原子变量)


可以看出,允许多个赋值的唯一可能方法是返回实际实现的
T

返回的是
T
,而不是
原子的
。如果它返回一个对非原子类型的引用,那么这一切都没有意义。但是原子支持++操作。如果返回atomic&,是否可能增加?如果返回
atomic&
,则可能会增加。那么原子类型运算符=不返回atomic&的原因是什么?@myoldGrand可能是因为这样很难将赋值与其他内容链接,类似于另一个赋值,或使用
if
或其他类型。类似于指针,引用应指向T类型的对象。但原子对象中没有存储T对象!=>什么意思?原子类型在itAtomic类型中有它的值,它的行为就像它在其中有一个T值一样。原子实现甚至可以有这个值,但它显然不会提供对它的直接访问。
std::atomic<uint32_t> a, b;
a = b = 5;