sha*_*oth 7 c++ gcc initialization visual-c++
首先是一些代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
是的,在COuter::COuter( const CInner& )参数中具有与成员变量相同的名称.
在有效的VC++中 - VC++认为用参数初始化成员变量是合理的,这就是发生的事情 - CInner::inner用参数初始化.但是当使用GCC编译它时,它会以另一种方式解释:GCC CInner::inner 自身初始化,因此它未被初始化.
哪个编译器是对的?
AnT*_*AnT 25
它并不是真正关于某些特定的编译器决定什么是合理的,什么不是.语言规范明确地说,在inner(inner)构造函数初始化列表中使用的第一个inner应该在类范围中查找(即解析为COuter::inner),而第二个inner应该在构造函数范围中查找(即解析为构造函数参数inner).
这就是您所描述的VC++行为.但是,我发现很难相信GCC在这种情况下会表现不正确(除非你有一些奇怪的旧版GCC).你确定你没有错误地解释GCC的行为吗?
Jer*_*fin 12
Visual C++是正确的.我怀疑你正在使用旧版本的gcc进行测试 - 至少我记得,最近的那些正确地做到了这一点.这在标准的§12.6.2/ 7中有所涉及,它给出了以下示例:
class X {
int a;
int b;
int i;
int j;
public:
const int& r;
X(int i): r(a), b(i), i(i), j(this->i) {}
};
Run Code Online (Sandbox Code Playgroud)
初始化X :: r以引用X :: a,使用构造函数参数i的值初始化X :: b,使用构造函数参数i的值初始化X :: i,[...]