3

以下代码:

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++ 中有很多方法可以让自己陷入困境;成员相互依赖就是其中之一。我知道这一点并且无论如何我都会避免这种情况,就像我会避免空指针取消引用一样。

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

4

3 回答 3

8

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

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

于 2012-05-31T14:57:30.450 回答
0

成员之间并不存在或可能存在相互依赖关系。原语,呵呵。

嗯,除非有人改变它:

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

大多数人认为最好在问题发生之前得到警告,这样他们就可以修复代码。您似乎是少数想要故意留下代码缺陷并抱怨编译器的人。

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

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

我对编译器无法识别此类情况并抱怨感到不满。

如果您不喜欢警告将其关闭,如何做到这一点在文档中(以及较早的答案,所以您甚至不必看远;-)

于 2012-06-02T00:38:03.717 回答
0

这是抱怨的一个非常重要的原因,有关详细信息,请参阅Scott Myers的书Effective C++ Item 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;    

w2一样的w1吗?

于 2012-06-02T00:53:35.327 回答