owenzhang的博客

gcc warning “will be initialized after/when initialized here”

字数统计: 212阅读时长: 1 min
2012/06/19
loading

下面这段代码会产生warning

#include <iostream>
using namespace std;

struct foo
{
    foo() : Y(1), X(Y+1) {}
    int X;
    int Y;
};

int main(int argc, char *argv[])
{
    return 0;
}

 

In constructor ‘foo::foo()’:
8: warning: ‘foo::Y’ will be initialized after
7: warning:   ‘int foo::X’
6: warning:   when initialized here

产生这个warning的原因是因为初始化列表的顺序和声明变量的顺序不一致。

编译器要求必须是一致的,否则会有问题。

上面的例子,X的值最开始初始化为Y+1,由于Y的值是垃圾值,所以X的值也是垃圾值,然后Y被初始化为1。

如果修改X和Y的声明顺序,则Y初始为1,X初始为2。

切记:

编译的时候带上-Wall选项!

不要放过一个warning!

在使用初始化列表的时候顺序要和声明一致!

CATALOG