【发布时间】:2012-10-25 05:25:53
【问题描述】:
根据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=返回T,那么&(v = 1)甚至不应该编译,对吧? -
@R.MartinhoFernandes:因为它是临时的右值?
-
它是否返回左值?如果不是,那么第二个 ++ 将无法编译,因此如果您确实希望这样做,至少可以避免出现错误行为。
-
@LightnessRacesinOrbit 因为它是prvalue。所以,是的,一些原子操作可能会按值返回,这与常见用法相反,但只有糟糕的编译器才会允许编译这些示例中的任何一个。
-
错误的编译器,或(不太可能)错误的类型
T专门用于std::atomic并且前缀operator++是可以绑定到右值的成员函数。但是,如果您专门针对您的用户定义类型使用std::atomic,那么您真的应该非常了解std::atomic,知道不要这样做。
标签: c++ c++11 operator-overloading atomic c++-standard-library