为什么 g++ -Wreorder 不更智能?
Why isn't g++ -Wreorder smarter?
看看g++-Wreorder的意义,我完全理解-Wreorder
的用处。但编译器能够检测这种重新排序是否无害,这似乎也不无道理:
struct Harmless {
C() : b(1), a(2) {}
int a;
int b;
};
或损坏:
struct Broken {
C() : b(1), a(b + 1) {}
int a;
int b;
};
那么,我的问题是:为什么GCC不检测(并警告)初始化器中未定义成员的实际使用,而不是对初始化器的排序发出全面警告?
据我所知,-Wuninitialized
只适用于自动变量,实际上它并没有检测到上面的错误。
编辑:
尝试将我想要的行为正式化:给定初始化器列表: a1(expr1), a2(expr2), a3(expr3) ... an(exprn)
,如果(并且仅当)任何初始化器的执行(按执行顺序)将引用未初始化的值,我希望得到警告。即以与-Wuninitialized
警告使用未初始化的自动变量相同的方式。
一些额外的背景:我在一家主要基于windows的公司工作,除了我之外,基本上每个人都使用Visual Studio。VS没有这个警告,因此没有人关心是否有正确的订单(除了手动检查之外,没有办法知道他们什么时候把订单搞砸了),因此给我留下了无尽的警告,每次有人弄坏东西时,我都必须不断地修复。我只想了解真正有问题的病例,而忽略良性病例。因此,我的问题可能更好地表述为:实现这样的警告/错误在技术上可行吗?我的直觉是这样的,但它还没有实现的事实让我怀疑它。
我的猜测是,这与我们拥有-Wold-style-cast
的原因相同:安全性过于保守。把CCD_ 6转换成CCD_。也许这个开发人员很着急,或者有一个旧版本的GCC,或者看到它"只是一个警告",就继续。
在许多警告中,这基本上是正确的。它们通常是伪造的,需要一点重组才能干净地编译,但在某些情况下,它们代表了真正的问题。每个优秀的程序员都会更喜欢处理一些假阳性,如果这意味着他们得到的假阴性更少的话。
如果这个问题有一个有效的直接答案,我会感到惊讶。我认为没有技术上的原因不能做到这一点。只是。为什么要费力地想弄清楚有问题的事情是否真的没事?编程是人类的工作。
出于个人原因,我认为按照声明变量的顺序初始化变量通常是有意义的。
- 1d 智能指针不适用于语法 (*)++
- 优先顺序:智能指针和类析构函数
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 智能指针作为无序映射键,并通过引用进行比较
- 智能指针概念所有权和寿命
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 尝试使用智能指针时引发异常
- 我可以制作指向智能指针的智能指针吗?
- 通过智能指针和转换对基本模板参数进行模板推导
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 从堆栈分配的原始指针构造智能指针
- 初始化指向类实例的智能指针并访问其方法
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 构造智能点数据类型以及普通数据类型的通用方法
- 编译器不会使用 -std=c++11 编译智能指针
- 为什么C++不支持对未初始化变量进行智能分析?
- 具有智能指针的多态性
- C++:矢量分配器行为、内存分配和智能指针
- 智能感知不适用于Visual Studio 2017中的cmake项目