2017-02-17 38 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

相關問題