我正在运行下面的简单程序,其中我没有初始化变量 x2,然后尝试在 main() 函数中使用它。我期待编译器发出 Wuninitialized 警告,但没有得到它。
#include <iostream>
using namespace std;
struct Obj
{
int x1;
int x2;
Obj() : x1(0) {}
};
int main()
{
Obj obj;
cout << obj.x1 << endl;
cout << obj.x2 << endl;
return 0;
}
编译正常,没有任何警告 - g++ --std=c++17 -Wall abc.cpp
如果我不初始化 x1 和 x2,我会收到预期的警告。
#include <iostream>
using namespace std;
struct Obj
{
int x1;
int x2;
// Obj() : x1(0) {}
};
int main()
{
Obj obj;
cout << obj.x1 << endl;
cout << obj.x2 << endl;
return 0;
}
现在我确实收到警告了。
g++ --std=c++17 -Wall abc.cpp
abc.cpp: In function ‘int main()’:
abc.cpp:16:17: warning: ‘obj.Obj::x1’ is used uninitialized in this function [-Wuninitialized]
16 | cout << obj.x1 << endl;
| ^~
abc.cpp:17:17: warning: ‘obj.Obj::x2’ may be used uninitialized in this function [-Wmaybe-uninitialized]
17 | cout << obj.x2 << endl;
| ^~
有人可以解释这种行为吗?
g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
我期待在这两种情况下都会出现 Wuninitialized 警告。