【发布时间】:2012-05-11 09:42:22
【问题描述】:
gcc 是否应该警告 C 类中成员变量 a 和 b 的初始化顺序?基本上,对象 b 已初始化,它的构造函数在对象 A 之前调用。这意味着 b 使用未初始化的 a。
#include <iostream>
using namespace std;
class A
{
private:
int x;
public:
A() : x(10) { cout << __func__ << endl; }
friend class B;
};
class B
{
public:
B(const A& a) { cout << "B: a.x = " << a.x << endl; }
};
class C
{
private:
//Note that because b is declared before a it is initialized before a
//which means b's constructor is executed before a.
B b;
A a;
public:
C() : b(a) { cout << __func__ << endl; }
};
int main(int argc, char* argv[])
{
C c;
}
来自 gcc 的输出:
$ g++ -Wall -c ConsInit.cpp
$
【问题讨论】:
-
你可以告诉它警告你。标志是 -Wreorder,它通过 -Wall 开启。
-
您应该确保使用
-Wall -Werror -Wextra -pedantic-errors进行编译。代码将无法编译,因为 gcc 会警告您正在使用未初始化的 -
@bamboon:你确定吗?代码在这里编译得很好。
-
看起来你的order初始化没问题。只是你没有初始化你的一个成员然后使用它。
-
我没有从 gcc 或 clang 收到最高警告级别的警告,这有点奇怪。您应该向相应的跟踪器提交错误。
标签: c++ gcc initialization initializer-list