考虑以下“代码”:
struct T
{
T();
static int x;
};
T::T::T::T::T::T()
{
}
int T::x;
int main()
{
T t1;
T::T t2;
T* p=static_cast<T::T::T::T*>(&t1);
T::T::T::T::T::x=5;
}
它可以使用g ++从4.7到8以及clang ++从3.5到6进行编译,而没有任何错误或使用-pedantic-errors
发出相关警告。显然,可以重复使用后跟作用域解析运算符的类名,而不会影响被命名的类类型的含义-就像该类嵌套在其内部一样。
这是编译器中的错误吗?还是以允许这种滥用的方式真正定义了C ++语言?
如果它确实是符合标准的C ++代码,是否有允许这样做的理由,还是仅仅是为了简化标准的措辞?