roa*_*alz 8 c++ gcc c++11 stdatomic visual-c++-2015
几天前,我写了类似下面的内容:
struct A {
std::atomic_bool b = false;
};
Run Code Online (Sandbox Code Playgroud)
使用VC++ 2015编译器在Visual Studio 2015 Update 3中编译,没有出现任何错误.
现在我在Ubuntu上用GCC(5.4.0)重新编译了同样的东西并得到了错误:
使用已删除的函数'std :: atomic :: atomic(const std :: atomic&)
我在ideone上遇到了同样的错误,设置为C++ 14(不确定它使用的是什么编译器版本).
当然将代码更改为以下修复了gcc的问题:
struct A {
std::atomic_bool b { false };
};
Run Code Online (Sandbox Code Playgroud)
我的问题是:
1.谁是正确的(C++ 11兼容),VC++或GCC?似乎VC++从bool调用构造函数,而GCC调用复制构造函数(已删除).
2.为了在类声明中初始化原子的默认值,是正确初始化(上面)正确/首选方式吗?或者我应该使用ATOMIC_VAR_INIT宏(呃!)吗?
struct A {
std::atomic_bool b = ATOMIC_VAR_INIT(false);
};
Run Code Online (Sandbox Code Playgroud)
VC在这里就错了。C++17 之前的代码在语义上X x = y意味着先调用 ,X tmp(y)然后再调用X(tmp) - 即,语义上调用了一个复制构造函数。
虽然我知道的所有编译器都消除了中间调用(标准允许),但程序仍然格式错误。看起来 VC 没有正确执行语义。
在 C++17 中,此调用的语义会发生变化,并且只需要一次初始化构造函数调用,因此代码将变得格式良好。