今天早些时候我偶然发现了 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
的警告not being initialized 通常会产生。 (有趣的是,启用 -O2
时,gcc 实际上不会产生任何警告。)
当然,我不能期望编译器警告我这些事情;但是这个案例让我想知道:
- 是否有特定原因导致相关编译器(当前)未检测/报告这种情况?
- ……甚至(我认为这不太可能):由于某种原因,一般来说,在
std::atomic<T>
的特定情况下检测/报告丢失的初始化是不可能的吗?其中T
没有默认构造函数? - 或者,也许我缺少另一个命令行开关,它会使编译器产生警告?
最佳答案
原因:很遗憾,我们无从知晓。也许为 gcc 开发做出贡献的人还没有人愿意去做或认为这是值得的。
无法检测?不是技术上的,我想。但这必须是一个特殊情况,否则你会引入大量警告,用于声明结构和类类型的 vars 的情况并不少见,没有显式定义的默认构造函数,没有初始化列表或其他任何东西。
值得添加一个特例吗?可能,但这是一个见仁见智的问题,并说服某人在 gcc 中实现它。
命令行开关?不是真的,虽然-Weffc++
可能会给你一些东西。我没试过。您也可以尝试通过 valgrind 运行它,也许会报告一些内容。也没试过。
关于c++ - 没有针对未初始化的 std::atomic<double> 的编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40899576/