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

问题描述 投票:0回答:2

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

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

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

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

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)) ===|
c++ atomic auto stdatomic
2个回答
6
投票

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

auto NewValue = value;

value
std::atomic<int>
,因此
auto
将推导出
std::atomic<int>
,而不是像您期望的那样推导出
int

哇哦,这个:

auto NewValue = value;

与此相同:

atomic<int> NewValue = value;

这是使用复制构造函数的复制初始化,但是

std::atomic
有一个
delete
'd复制构造函数,这正是错误消息所说的:

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

std::atomic
T
转换运算符,这就是
int NewValue = value;
起作用的原因。


4
投票

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

这就是

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

但是,您可以使用

int
转换将其向下转换为
operator int
http://en.cppreference.com/w/cpp/atomic/atomic/operator_T

© www.soinside.com 2019 - 2024. All rights reserved.