Что если параметр конструктора имеет то же имя, что и переменная-член в C ++? - PullRequest
7 голосов
/ 09 февраля 2010

Сначала код:

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;
}

Да, в COuter::COuter( const CInner& ) параметр имеет то же имя, что и переменная-член.

В VC ++, который работает - VC ++ получает идею, что разумно только инициализировать переменную-член параметром, и вот что происходит - CInner::inner инициализируется с параметром. Но когда то же самое компилируется с GCC, оно интерпретируется по-другому: GCC инициализирует CInner::inner самой собой , и поэтому оно остается неинициализированным.

Какой из компиляторов прав?

Ответы [ 2 ]

25 голосов
/ 09 февраля 2010

Это не совсем какой-то конкретный компилятор, решающий, что разумно, а что нет. В спецификации языка явно сказано, что в inner(inner), используемом в списке инициализатора конструкторов, первый inner должен быть найден в области видимости класса (т. Е. Преобразован в COuter::inner), а второй inner должен быть найден в конструкторе область действия (т. е. разрешение в параметре конструктора inner).

Это то, что вы описали как поведение VC ++. Однако мне трудно поверить, что GCC будет вести себя некорректно в этом случае (если у вас нет какой-то странной старой версии GCC). Вы уверены, что как-то неправильно поняли поведение GCC?

12 голосов
/ 09 февраля 2010

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) {}

};

инициализирует X :: r для ссылки на X :: a, инициализирует X :: b значением конструктора параметр i, инициализирует X :: i значением параметра конструктора i, [...]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...