前几天我写过类似的内容:
struct A {
std::atomic_bool b = false;
};
使用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 };
};
我的问题是:
1.谁是正确的(符合C ++ 11),VC ++或GCC?似乎VC ++从bool调用构造函数,而GCC调用复制构造函数(已删除)
2.为了在类声明中初始化原子的默认值,是正确初始化(上面)正确/首选方式吗?或者我应该使用ATOMIC_VAR_INIT宏(呃!)?
struct A {
std::atomic_bool b = ATOMIC_VAR_INIT(false);
};
答案 0 :(得分:2)
VC在这里错了。从语义上讲,前代C ++ 17代码X x = y
意味着调用X tmp(y)
,然后调用X(tmp)
- 即,语义上有一个复制构造函数。
虽然我知道所有编译器都消除了中间调用(标准允许),但程序仍然是格式错误。看起来VC并没有正确执行语义。
在C ++ 17中,这个调用的语义会发生变化,并且只需要一个初始化构造函数调用,因此代码将变得格式良好。