根据this前缀 std::atomic<T>::operator++
返回 T
,所以这段代码只会增加 v
一次:
template<class T> void addTwo(std::atomic<T>& v) {
++(++v);
}
另外,std::atomic<T>::operator=
apparently返回 T
,因此此代码取消引用一个无效指针,该指针曾经指向临时 T
:
template<class T>
void setOneThenTwo(std::atomic<T>& v) {
auto ptr = &(v = 1);
*ptr = 2;
}
我绝对不是说这些代码模式是好的实践,但是让我非常惊讶的是 std::atomic
打破他们。我一直期待 operator=
和前缀 operator++
返回对 *this
的引用.
问题: cppreference 关于此处的返回类型是否正确,如果正确,是否有充分的理由使用 std::atomic
在这方面的行为与内置类型不同?
最佳答案
如果 operator++
返回一个引用,它将是对 std::atomic<T>
的引用不去T
在这种情况下,您需要做一个额外的 load
获取当前值。
假设您有一个 DBMS,并且需要维护一个“自动增量”字段
与 operator++
重调T
你可以这样做
class AutoIncrement
{
public:
AutoIncrement() : current (0) {}
unsigned int next()
{
return ++current;
}
private:
std::atomic<unsigned int> current;
};
现在想象一下 operator++
返回 std::atomic<T>&
在那种情况下,当您执行 return ++current
它会做两件事
- 原子读-修改-写
- 原子负载
它们是两个完全独立的操作。如果其他线程调用next
在这两者之间,您的自动增量字段会得到错误的值!
关于c++ - std::atomic::operator++ 真的按值返回吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13231048/