为什么原子不能与自动变量一起使用

Alo*_*lok 0 c++ atomic auto stdatomic

我不确定以下语句有什么问题,它给了我编译错误。我们不能将“auto”与原子变量一起使用吗?

#include <iostream>
#include<future>
#include <atomic>
using namespace std;

int main()
{
  atomic<int> value(10);
  auto   NewValue = value;
}
Run Code Online (Sandbox Code Playgroud)

但如果我用“int”替换“auto”,它就可以工作。为什么?

int main()
{
  atomic<int> value(10);
  int NewValue = value;
}
Run Code Online (Sandbox Code Playgroud)

“auto”编译错误

 ||=== Build: Debug in Hello (compiler: GNU GCC Compiler) ===|
 F:\3d\C++CodeProject\Hello\main.cpp||In function 'int main()':|
 F:\3d\C++CodeProject\Hello\main.cpp|11|error: use of deleted function 
 'std::atomic<int>::atomic(const std::atomic<int>&)'|
C:\Program Files 
(x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\atomic|612|note: 
declared here|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 6

auto与赋值右侧的数据类型匹配。在这份声明中:

auto NewValue = value;
Run Code Online (Sandbox Code Playgroud)

value是 a std::atomic<int>,所以auto会推断出std::atomic<int>,不int符合您的期望。

哇哦,这个:

auto NewValue = value;
Run Code Online (Sandbox Code Playgroud)

与此相同:

atomic<int> NewValue = value;
Run Code Online (Sandbox Code Playgroud)

这是使用复制构造函数进行复制初始化std::atomic,但有一个delete'd 复制构造函数,这正是错误消息所说的内容:

使用已删除的函数 'std::atomic<int>::atomic(const std::atomic<int>&)'

std::atomic有一个转换运算符 forT,这就是有效的原因int NewValue = value;


更新:如果您确实想使用auto并将其推导为int,您可以std::atomic显式转换 来调用转换运算符,例如:

auto NewValue = (int) value;
Run Code Online (Sandbox Code Playgroud)

或者

auto NewValue = static_cast<int>(value);
Run Code Online (Sandbox Code Playgroud)

否则,使用该std::atomic::load()方法,如评论中提到的@PeterCordes,例如:

auto NewValue = value.load();
Run Code Online (Sandbox Code Playgroud)