2016-11-30 54 views
1

今天早些時候,我偶然發現了addition on std::atomic<double> not adding up to non-atomic counterpart,原因是std::atomic<double>未被初始化(另請參閱What's the default value for a std::atomic?)。但是,引起我注意的是,我的編譯器沒有警告我關於std::atomic<double>未初始化的事實。試想一下:未初始化std :: atomic的編譯器警告<double>

#include <iostream> 
#include <atomic> 

int main() 
{ 
    std::atomic<double> d; 
    double e; 

    std::cout << d << " " << e << std::endl; 
} 

無論鐺3.8也不GCC 6.2似乎能夠產生預警d未初始化。請參閱live at coliru:我使用-Wall -pedantic -Wextra,但在有和沒有-O2的情況下都沒有發出警告。通常會產生一個關於e未被初始化的警告。 (有趣的是,當-O2啓用GCC實際上不產生任何警告。)

我當然不能指望編譯器警告我這些事情;但這種情況讓我想知道:

  • 是否有一個特定的原因,爲什麼這種情況沒有(當前)由有問題的編譯器檢測/報告?
  • ...甚至(我會認爲這是不太可能的):在一般情況下,由於某種原因,無法在std::atomic<T>的特定情況下檢測/報告缺少的初始化,其中T沒有默認構造函數?
  • 或者,也許是隻有另一個命令行開關我缺少這將使編譯器產生警告?

回答

0

爲什麼:不幸的是我們沒有辦法知道。也許沒有人會爲gcc開發做出貢獻,或者認爲這是值得的。

不可能檢測?我想,不是技術上的。但它必須是一個特殊情況,否則你會引入大量的警告,用於聲明結構和類類型的變量的一個不常見的情況,沒有明確定義的默認構造函數沒有初始化列表或其他。

值得添加特殊情況嗎?也許,但這是一個意見問題,並說服別人實施它在海灣合作委員會。

命令行開關?不是真的,雖然-Weffc++可能會給你一些東西。我沒有嘗試過。你也可以嘗試通過valgrind運行它,也許這會報告一些東西。也沒有嘗試過。

+0

謝謝。我試過'-WeffC++',不幸的是這種情況沒有什麼區別。 – mindriot