GCC 警告初始化顺序与声明顺序不匹配

GCC warns about order of initialization not matching the order of declaration

本文关键字:顺序 声明 不匹配 GCC 初始化 警告      更新时间:2023-10-16

以下代码:

class C
{
    int a, b;
public:
    C()
    :b(0), a(0)
    {}
};

导致 GCC 抱怨错误的初始化顺序。具体说来:

../AppSrc/MainForm.cpp: In constructor 'C::C()':
../AppSrc/MainForm.cpp:51:9: warning: 'C::b' will be initialized after
../AppSrc/MainForm.cpp:51:6: warning:   'int C::a'

这有什么大不了的,为什么要抱怨?这不像成员之间存在或可能存在相互依赖关系。原始人,呃。

哦,我如何关闭此警告或至少使其不那么激进?

编辑:有很多方法可以在C++中搬起石头砸自己的脚;成员相互依赖就是其中之一。我知道这一点,无论如何我都会避免它,就像我会避免空指针取消引用一样。

任意初始化顺序可以是完全安全的,就像上面的代码片段一样。我对编译器不承认这种情况并抱怨感到不满。我的意思是,它不会抱怨每个指针取消引用之前没有立即进行空检查,是吗?

在此特定示例中,可以安全地忽略警告。如果它们相互依赖,你就会遇到问题。您可以使用 -Wno-reorder .

最好重新排序它们。它可能对编译器没有影响,但你会养成按照成员出现的顺序初始化成员的习惯,这是一件好事。

这不像成员之间存在或可能存在相互依赖关系。原始人,呃。

呃,除非有人改变它:

class C
{
  int a, b;
public:
  C()
  :b(a), a(0)
  {}
};

大多数人认为最好在问题发生之前收到警告,以便他们可以修复代码。您似乎是少数人,他们希望故意使代码有缺陷并抱怨编译器。

任意初始化顺序可以是完全安全的,就像上面的代码片段一样。

关键是初始化的顺序不是任意的,它总是按照成员的声明顺序,当我们以错误的顺序编写 mem 初始化器时,我们中的一些人希望得到警告。

我对编译器不承认这种情况并抱怨感到不满。

如果您不喜欢警告将其关闭,则如何在文档中执行此操作(以及在较早的答案中,因此您甚至不必看得太远;-)

这是抱怨的一个非常重要的原因,有关详细信息,请参阅斯科特迈尔斯书有效C++第 13 项第 57 页。

或者正如他在第58页所说的那样:

class Wacko {
   public:
      Wacko(const char *s): s1(s), s2(0) {}
      Wacko(const Wacko &rhs): s2(rhs.s1), s1(0) {}
   private:
      string s1, s2;
};
Wacko w1 = "Hello World!";
Wacko w2 = w1;    

w2w1一样吗?