首先是一些代码:
class CInner {
public:
CInner( const CInner& another ) { //impl here }
private:
// some member variables
}
class COuter {
public:
COuter( const CInner& inner ) : inner( inner ) {}
private:
CInner inner;
}
Yes, in COuter::COuter( const CInner& )
参数与成员变量同名。
在 VC++ 中可行 - VC++ 认为只有使用参数初始化成员变量才是合理的,这就是发生的情况 -CInner::inner
使用参数进行初始化。但是当用 GCC 编译它时,它会以另一种方式解释:GCC 初始化CInner::inner
与它自己所以它未被初始化。
哪个编译器是正确的?
它实际上并不是由某个特定的编译器决定什么是合理的,什么是不合理的。语言规范明确指出inner(inner)
在构造函数初始值设定项中使用的第一个inner
应该在类范围内查找(即解析为COuter::inner
),而第二个inner
应该在构造函数范围中查找(即解析为构造函数参数inner
).
这就是您所描述的 VC++ 行为。然而,我发现很难相信 GCC 在这种情况下会表现不正确(除非你有一些奇怪的旧版本的 GCC)。你确定你没有以某种方式误解了 GCC 的行为吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)