2017-02-17 35 views
8

前几天我写了类似如下:为什么Visual C++ 2015允许std :: atomic assignment?

struct A { 
    std::atomic_bool b = false; 
}; 

在Visual Studio 2015年编译更新3,其VC++编译器2015年,无可厚非弹出。
现在我已经重新编译与海湾合作委员会(5.4.0)同样的事情在Ubuntu和得到了错误:

use of deleted function 'std::atomic::atomic(const std::atomic&)

我上ideone了同样的错误,设置为C++ 14(不知道编译器它使用的版本)。

过程中更改代码下面固定的问题与海湾合作委员会:

struct A { 
    std::atomic_bool b { false }; 
}; 

我的问题是:
1.谁是正确的是(C++ 11兼容)这里,VC++或GCC?看来,VC++调用布尔的构造函数,而GCC调用复制构造函数(删除)。
2.为了在类声明中初始化一个原子的默认值的目的是统一初始化(上)正确的/首选的方式?还是应该使用ATOMIC_VAR_INIT宏(呃!)呢?

struct A { 
    std::atomic_bool b = ATOMIC_VAR_INIT(false); 
}; 
+1

请参阅http://stackoverflow.com/questions/21708606/why-does-an-in-place-member-initialization-use-a-copy-constructor-in-c11。而对于问题2,不要使用ATOMIC_VAR_INIT,这主要是为了兼容C11。 – interjay

回答

3

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

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

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

+0

然后,我不知道VC++ 2015是否已经实现了C++ 17草案。 – roalz

+0

@roalz在C++ 11程序中仍然是错误的。 – Surt

+1

@Surt当然,据我所知,VC++ 2015更新3应该默认使用/ std:C++ 14开关(就像我的情况一样):https://blogs.msdn.microsoft.com/vcblog/2016/06/07 /标准的版本开关-内式编译器/。所以它绝对是一个VC++兼容性问题。 – roalz

相关问题