如果构造函数参数与C++中的成员变量同名,该怎么办?

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,[...]

  • @Craig:怎么样?我说"难以阅读"就是当你必须跟踪两个不同的名称时,它们在概念上是同一个对象.当然,member和constructor参数应该具有相同的名称.他们*应该*是相同的. (8认同)
  • 它可能是正确的,但它是丑陋的,所有的地狱,使阅读比需要更难. (3认同)