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

时间:2018-07-30 15:05:58

标签: c++ class scope

考虑以下“代码”:

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 ++代码,是否有允许这样做的理由,还是仅仅是为了简化标准的措辞?

0 个答案:

没有答案