2016-11-30 51 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