[英]std::atomic error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive]
[英]Does std::atomic::operator++ really return by value?
根据这个前缀, std::atomic<T>::operator++
返回一个T
,所以这段代码只增加v
一次:
template<class T> void addTwo(std::atomic<T>& v) {
++(++v);
}
此外, std::atomic<T>::operator=
显然返回一个T
,因此该代码取消引用一个用于指向临时T
的无效指针:
template<class T>
void setOneThenTwo(std::atomic<T>& v) {
auto ptr = &(v = 1);
*ptr = 2;
}
我肯定不会建议这些代码模式是好的做法,但是std::atomic
打破它们对我来说非常令人惊讶。 我总是希望operator=
和prefix 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++11: 29.6.5/32]
和[C++11: 29.6.5/10]
,是的, cppreference.com在这方面是正确的。
我没资格告诉你原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.