为什么T :: T :: T :: T :: T :: T与类名相同?

Rus*_*lan 5 c++ scope class

考虑以下"代码":

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;
}
Run Code Online (Sandbox Code Playgroud)

它汇编了4.7到8的g ++和3.5到6的clang ++,没有任何错误或相关的警告-pedantic-errors.显然,可以重复类名后跟范围解析运算符,而不会影响被命名的类类型的含义 - 就好像该类嵌套在自身内部一样.

这是编译器中的错误吗?或者C++语言是否真的以这样的方式定义它容忍这种滥用?

如果它是真正符合标准的C++代码,是否有任何理由允许这样做,或者仅仅是为了简化标准的措辞?