【发布时间】:2014-08-08 17:21:19
【问题描述】:
如果初始化器列表顺序与类中的变量顺序不匹配,为什么 gcc 会抛出乱码?
class myClass
{
public:
int A;
int B;
myClass();
};
myClass::myClass() :
B(1),
A(2)
{}
将导致:
file.h:274: warning: 'myClass::A' will be initialized after
file.h:273: warning: 'int myClass::B
file.cpp:581: warning: when initialized here
发出这种警告有什么具体原因吗?以不同于类中定义的顺序初始化类的变量是否存在任何风险?
(请注意,有 a question 涉及主题,但答案几乎是“因为它应该是这样”,而没有给出任何理由说明 为什么 它应该被订购,或者是什么这是错误的 - 我想知道为什么存在这样的限制 - 有人可以举一个可能适得其反的例子吗?)
【问题讨论】:
-
@ShafikYaghmour:该标准不构成限制,因为这是其作者的反复无常。每个限制都是一些考虑的结果。所以,不,到目前为止,“因为标准是这样说的”还不是一个充分的答案。当然,该标准的某些决定可能存在问题或完全错误 - 但即使是这些问题和错误也源于某些根源。
-
所以也许你的问题应该是“为什么初始化的顺序是声明的顺序?”而不是询问警告。
-
“发出这种警告有什么具体原因吗?” - 一个原因是为了帮助你。
-
@dyp 你只需要添加一个事实,即有一个类定义和可能有许多 mem-init-lists。
-
@dyp:如果遵循无法实现的mem-init-list,则破坏顺序与构造顺序相反(一个成员可以依赖另一个成员)。 (我会写一个答案,但是在电话上打字很痛苦:))
标签: c++ constructor initializer-list