【问题标题】:Why Visual C++ 2015 allows std::atomic assignment?为什么 Visual C++ 2015 允许 std::atomic 赋值?
【发布时间】:2017-02-17 14:26:22
【问题描述】:

几天前我写了如下内容:

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

【问题讨论】:

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


【解决方案1】:

VC在这里错了。 Pre-C++17 在语义上代码X x = y 表示调用X tmp(y),然后调用X(tmp) - 即,语义上调用了一个复制构造函数。

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

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

【讨论】:

  • 我想知道 VC++2015 是否已经实现了 C++17 草案中的某些内容。
  • @roalz 在 C++11 程序中仍然是错误的。
  • @Surt 当然,据我所知,VC++2015 更新 3 默认应该有 /std:c++14 开关(如我的情况):blogs.msdn.microsoft.com/vcblog/2016/06/07/…。所以这绝对是一个 VC++ 兼容性问题。
  • Visual Studio 团队采取了同时实现 C++14 和 C++17 的方式,所以 C++17 的一些特性在 C++ 的某些部分之前实现了14.看起来这是他们已经实现 C++17 的领域之一。
  • @Sjoerd 但它会与默认的 /std:c++14 编译器开关不一致。我的意思是,如果我指定编译器使用 c++14,恕我直言,包含来自 c++17 的部分内容是错误的。而且,由于我的案例在 C++14 中格式不正确,我希望 VC++ 会给出错误,因为 GCC 在 c++14 模式下。
猜你喜欢
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2013-05-08
  • 2017-03-18
  • 2012-03-22
  • 2015-10-06
相关资源
最近更新 更多