铿锵++;无法检测未初始化成员变量的使用 使用CLAN+++版本11和C++ 17,编译器标志墙>代码,如果在初始化之前使用变量,CLAN通常会抱怨。但是,它没有检测到以下情况: struct Bar { bool b1; }; class Foo { public: Foo() : b2(Bar{b2}.b1) // We are using b2 here before it is initialized, but clang doesn't complain { } bool b2; };

铿锵++;无法检测未初始化成员变量的使用 使用CLAN+++版本11和C++ 17,编译器标志墙>代码,如果在初始化之前使用变量,CLAN通常会抱怨。但是,它没有检测到以下情况: struct Bar { bool b1; }; class Foo { public: Foo() : b2(Bar{b2}.b1) // We are using b2 here before it is initialized, but clang doesn't complain { } bool b2; };,c++,c++17,clang++,C++,C++17,Clang++,这是我能创建的最简单的示例。似乎只有在使用对象(Bar)的成员变量(b1)初始化构造函数中的成员变量(在本例中为b2)时才会发生这种情况。有人知道为什么clang在这里没有发现问题吗 我知道这是一个人为的例子,但它实际上给我带来了一个问题,我想了解一下。在一般情况下,在初始化成员变量之前,无法检测是否使用了该变量。对一般程序这样做违反了赖斯定理 编译器不会尝试 相反,他们有一些简单而廉价的启发式方法,可以捕捉常见的情况 不能依赖编译器检测使用未初始化变量的每种情况 在这种特殊情况下,您在初始化之

这是我能创建的最简单的示例。似乎只有在使用对象(Bar)的成员变量(b1)初始化构造函数中的成员变量(在本例中为b2)时才会发生这种情况。有人知道为什么clang在这里没有发现问题吗


我知道这是一个人为的例子,但它实际上给我带来了一个问题,我想了解一下。

在一般情况下,在初始化成员变量之前,无法检测是否使用了该变量。对一般程序这样做违反了赖斯定理

编译器不会尝试

相反,他们有一些简单而廉价的启发式方法,可以捕捉常见的情况

不能依赖编译器检测使用未初始化变量的每种情况

在这种特殊情况下,您在初始化之前将
b2
传递给另一个类,但仅使用它初始化临时变量。然后用于初始化最初初始化的变量

如果这是你最简单的例子,那么clang做得很好。当您将变量用作其自身初始化语句的一部分时,编译器在这方面的表现往往更差

下面是一个更简单的例子:

class Foo {
public:
  Foo()
    : b2((bool const&)b2) // We are using b2 here before it is initialized, but clang doesn't complain
  { }

  bool b2;
};
另一种情况:

struct Bob {
    bool b;
    operator bool() const{ return b; }
};

class Foo {
public:
  Foo()
    : b2(Bob{b2}) // We are using b2 here before it is initialized, but clang doesn't complain
  { }

  bool b2;
};
另一个

Bob bob = {Bob{bob.b}.b};
我可以继续


Clang并不声称检测所有未初始化的变量使用。因此,未能检测到一个并不是一个“错误”。相反,让他们检测另一个未初始化的情况是一项新功能。

在一般情况下初始化成员变量之前,无法检测是否使用了该变量。对一般程序这样做违反了赖斯定理

编译器不会尝试

相反,他们有一些简单而廉价的启发式方法,可以捕捉常见的情况

不能依赖编译器检测使用未初始化变量的每种情况

在这种特殊情况下,您在初始化之前将
b2
传递给另一个类,但仅使用它初始化临时变量。然后用于初始化最初初始化的变量

如果这是你最简单的例子,那么clang做得很好。当您将变量用作其自身初始化语句的一部分时,编译器在这方面的表现往往更差

下面是一个更简单的例子:

class Foo {
public:
  Foo()
    : b2((bool const&)b2) // We are using b2 here before it is initialized, but clang doesn't complain
  { }

  bool b2;
};
另一种情况:

struct Bob {
    bool b;
    operator bool() const{ return b; }
};

class Foo {
public:
  Foo()
    : b2(Bob{b2}) // We are using b2 here before it is initialized, but clang doesn't complain
  { }

  bool b2;
};
另一个

Bob bob = {Bob{bob.b}.b};
我可以继续


Clang并不声称检测所有未初始化的变量使用。因此,未能检测到一个并不是一个“错误”。更确切地说,让他们检测另一个未初始化的情况是一个新的特性。

看起来像是一个CLANG BUG,我考虑报告它。没有C++编译器需要在一个可能发生的情况下使用一个未初始化的变量。任何时候,只要你的编译器足够聪明,它都是额外的奖励。。。。报告它确实是一个人能做的最有意义的事情。
gcc
icc
也不要抱怨。也不知道<代码> Cl<代码>。找到所有未使用的用途本质上就是停顿的问题,不是吗?看起来像一个Clangbug,对我来说,考虑报告它。没有C++编译器需要在一个可能发生的情况下使用一个未初始化变量。任何时候,只要你的编译器足够聪明,它都是额外的奖励。。。。报告它确实是一个人能做的最有意义的事情。
gcc
icc
也不要抱怨。
cl
。找到所有未使用的用途基本上是一个停止的问题,不是吗?