以下代码:
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 ++来自拍;成员相互依赖就是其中之一。我知道这一点,无论如何我都避免这种情况,就像我会避免空指针解除引用一样。任意初始订单可以非常安全,就像上面的代码段一样。我不满意编译器没有认识到这种情况并抱怨无论如何。我的意思是,它没有抱怨每一个指针取消引用都没有立即进行空检查,是吗?
答案 0 :(得分:6)
在此特定示例中,可以安全地忽略警告。如果他们相互依赖,那你就有问题了。您可以使用-Wno-reorder
将其关闭。
但更好地重新排序。它可能对编译器没有什么影响,但是你会习惯按照它们出现的顺序初始化成员,这是一件好事。
答案 1 :(得分:0)
这与成员之间的相互依赖性不同,或者可能存在。原始人,呃。
呃,除非有人改变它:
class C
{
int a, b;
public:
C()
:b(a), a(0)
{}
};
大多数人认为在问题发生之前得到关于的警告会更好,这样他们就可以修复代码。你似乎是少数人,他们想让代码故意留下瑕疵并抱怨编译器。
任意初始订单可以非常安全,就像上面的代码段一样。
关键是初始化的顺序不是任意的,它始终按成员声明的顺序排列,当我们以错误的顺序编写mem-initializers时,我们中的一些人会被警告。
我不满意编译器无法识别此类情况并抱怨无论如何。
如果您不喜欢该警告,请将其关闭,如何做到这一点在文档中(在早期的答案中,所以您甚至不必看远; - )
答案 2 :(得分:0)
非常 抱怨的重要原因,请参阅 Scott Myers book Effective 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;
w2
与w1
相同吗?