std :: atomic :: operator ++真的按值返回吗?

Bja*_*une 13 c++ operator-overloading atomic c++-standard-library c++11

根据这个前缀std::atomic<T>::operator++返回一个T,所以这段代码只增加v一次:

template<class T> void addTwo(std::atomic<T>& v) {
  ++(++v);
}
Run Code Online (Sandbox Code Playgroud)

此外,std::atomic<T>::operator= 显然返回a T,因此此代码取消引用用于指向临时的无效指针T:

template<class T>
void setOneThenTwo(std::atomic<T>& v) {
  auto ptr = &(v = 1);
  *ptr = 2;
}
Run Code Online (Sandbox Code Playgroud)

我肯定不会建议这些代码模式是好的做法,但是对我来说std::atomic打破它们是非常令人惊讶的.我总是期望operator=和前缀operator++返回引用*this.

问题:这里的返回类型是否正确cppreference,如果是这样,std::atomic在这方面是否有充分的理由表现出与内置类型不同的行为?

小智 20

如果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;
};
Run Code Online (Sandbox Code Playgroud)

现在想象一下operator++返回std::atomic<T>& 在这种情况下,当你这样做return ++current时会做两件事

  1. 原子读 - 修改 - 写
  2. 原子载荷

他们是两个完全独立的行动.如果next你之间的其他线程调用你的自动增量字段将得到错误的值!

  • +1.简而言之,因为原子(增量并返回新值)比(原子增量)和(返回对原子对象的引用)更有用,设计师认为它证明了稍微令人惊讶的返回类型. (4认同)