首页 > 解决方案 > 为什么 T::T::T::T::T::T 与 T 相同的类名?

问题描述

考虑以下“代码”:

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;
}

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

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

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

标签: c++classscope

解决方案


推荐阅读