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