今天早些时候,我偶然发现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>
未初始化的事实。考虑:
#include <iostream>
#include <atomic>
int main()
{
std::atomic<double> d;
double e;
std::cout << d << " " << e << std::endl;
}
clang 3.8和GCC 6.2似乎都无法发出d
未初始化的警告。请参阅live at coliru:我使用了-Wall -pedantic -Wextra
,但无论有无-O2
都没有警告。当然,通常会产生关于e
未初始化的警告。 (有趣的是,当-O2
启用时,gcc实际上不会产生任何警告。)
当然,我不能期望编译器警告我这些事情;但是这个案子让我想知道:
std::atomic<T>
具有T
的特定情况下检测/报告缺少的初始化是不可能的没有默认构造函数?答案 0 :(得分:0)
为什么:不幸的是我们无从得知。也许没有人为gcc的发展做出贡献,或者认为这样做是值得的。
无法检测?我认为不是技术上的。但它必须是一个特殊的情况,否则你会引入大量的警告,为一个非常罕见的情况声明结构和类类型的变量没有明确定义的默认构造函数而没有初始化列表或其他。
值得添加一个特例吗?可能,但这是一个意见问题,并说服某人在gcc中实现它。
命令行开关?不是真的,虽然-Weffc++
可能会给你一些东西。我没试过。你也可以尝试通过valgrind运行它,也许会报告一些东西。还没试过。