为什么原子不能与自动变速器一起工作

时间:2018-05-04 00:15:42

标签: c++

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

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

int main()
{
  atomic<int> value(10);
  auto   NewValue = value;
}

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

int main()
{
  atomic<int> value(10);
  int NewValue = value;
}

“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)) ===|

2 个答案:

答案 0 :(得分:4)

原子变量不是可复制的:http://en.cppreference.com/w/cpp/atomic/atomic/atomic(3)

这是auto在这种情况下尝试做的事情。

但是,您可以使用int转换将其转换为operator inthttp://en.cppreference.com/w/cpp/atomic/atomic/operator_T

答案 1 :(得分:4)

auto匹配作业右侧的数据类型。在这个声明中:

auto NewValue = value;

valuestd::atomic<int>,因此auto会推断为std::atomic<int>,而不是int,就像您期望的那样。

IOW,这个:

auto NewValue = value;

与此相同:

atomic<int> NewValue = value;

哪个copy initialization使用了复制构造函数,但std::atomic有一个delete&#39; d复制构造函数,这正是错误消息所说的内容:

  

使用已删除的函数&#39; std :: atomic&lt; int&gt; :: atomic(const std :: atomic&lt; int&gt;&amp;)&#39;

std::atomic有一个conversion operator for T,这就是int NewValue = value;有效的原因。