为什么 std::atomic<T>::operator= 应该 return 一个值而不是引用?

Why does std::atomic<T>::operator= should return a value instead of reference?

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

为什么 std::atomic::operator= 应该 return 一个值而不是引用? 它不同于其他 return 引用的常见赋值运算符。

cppreference 站点我可以得到一些提示。

Unlike most assignment operators, the assignment operators for atomic types do not return a reference to their left-hand arguments. They return a copy of the stored value instead.

我可以猜到,如果我使用引用,它有一个原子性的问题。 但是我不是很清楚。

你有异步错误案例的例子吗?

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

Do you have any example for the async error case ?

该运算符的 return 类型是 T。如果是 T&,你可以这样做:

atomic<int> i;
++(i = 10);

++ 将是非原子读-递增-写,这是非常错误的。

And if I return a value instead of a reference, why does the async error gone?

因为它 return 是一个副本,而不是参考,所以你不能按照我上面显示的那样做。

operator= 有一个 return 值,允许在一行中进行多个赋值:

Object a, b;
// Short form
a = b = <value>;
// Equivalent long form
a = <value>;
b = <value>;

为了完成这个行为,可以考虑 std::atomic<T>::operator= 到 return TT &std::atomic<T> &:

  • T

    这就是运算符的实际实现方式。

  • T &

    像指针一样,引用应该指向到类型T的对象。 但是没有 T对象存储在一个原子对象中!

    所以,没有什么适合return编成T &

  • std::atomic<T> &

    用这样的return打一个不能

    std::atomic<uint32_t> a, b;
    a = b = 5;
    

    b = 5 returns 类型 std::atomic<T> &,并且一个 不能 赋值 该类型的原子变量 a 因为对应的 operator= 被标记为 deleted (禁止将一个原子变量分配给另一个原子变量)。

如您所见,允许多重赋值的唯一可能方法是 returning T,因为它已实际实现。