为什么 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 T
、T &
或 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
,因为它已实际实现。
在 c++ 中使用原子类型时
为什么 std::atomic
从 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 T
、T &
或 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
,因为它已实际实现。