c++ - 没有针对未初始化的 std::atomic<double> 的编译器警告

标签 c++ initialization g++ clang++ stdatomic

今天早些时候我偶然发现了 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/

相关文章:

C++ 将字符串转换为 char * 然后返回

c++ - 没有用户提供的构造函数的 const 限定类型的默认初始化

struct - 在 Rust 中是否保证了 struct 字段的初始化顺序?

c++ - g++ 只为 linux 编译跨平台

c++ - 在指针上定义运算符重载

c++ - 这是为 std::allocator 存储状态的正确方法吗?在本例中,由 Windows 上的共享内存支持?

c++ - C++ 中的结构与数组

c++11 - helgrind 不检测 std::mutex 的递归锁定

macos - 为什么我在 Mac OS X 中有两个版本的 gcc 和 g++?

c++ - 立即传递其成员时的右值范围