![](/img/trans.png)
[英]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.