Я столкнулся с производственным кодом, который заставил меня задуматься, зачем он компилировался. Я свел это к следующему.
Я скомпилировал его с помощью 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 :: я добавляю к типу, он все равно компилируется.
Я подозреваю, что это может быть проблема простого парсера, но не уверен.