Почему этот вывод типа C ++ разрешен

Я столкнулся с производственным кодом, который заставил меня задуматься, зачем он компилировался. Я свел это к следующему.

Я скомпилировал его с помощью gcc 6.4.1 и 8.1 вместе с парой других онлайн-компиляторов, и все они не сообщают об ошибках.

struct Y
{
};

struct X
{
    using XY = Y;
};

struct VZ
{
    virtual void f( X::X::XY xy ) = 0;
};

struct Z : public VZ
{
    virtual void f( X::XY xy ) override {}
};

int main( int c, char *v[] )
{
}

Обратите внимание, что чистый виртуальный объект объявлен с неправильным типом (X :: X :: XY). Также не имеет значения, сколько X :: я добавляю к типу, он все равно компилируется.

Я подозреваю, что это может быть проблема простого парсера, но не уверен.


person ScaryAardvark    schedule 03.07.2018    source источник


Ответы (1)


Это ожидаемое поведение, оно называется введенным именем класса. X::X относится к имени класса X, то же самое, что и X::X::X, и так далее. X::X::XY здесь такой же, как X::XY.

В области действия класса имя текущего класса обрабатывается так, как если бы оно было публичным именем члена; это называется введенным-именем-классом.


Кстати: это не имеет ничего общего с выводом типа; который обычно используется как еще один термин C ++.

person songyuanyao    schedule 03.07.2018