为什么Visual C ++ 2015允许std :: atomic赋值?

时间:2017-02-17 14:26:23

标签: c++ c++11 gcc stdatomic visual-c++-2015

前几天我写过类似的内容:

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

1 个答案:

答案 0 :(得分:2)

VC在这里错了。从语义上讲,前代C ++ 17代码X x = y意味着调用X tmp(y),然后调用X(tmp) - 即,语义上有一个复制构造函数。

虽然我知道所有编译器都消除了中间调用(标准允许),但程序仍然是格式错误。看起来VC并没有正确执行语义。

在C ++ 17中,这个调用的语义会发生变化,并且只需要一个初始化构造函数调用,因此代码将变得格式良好。