C++ 类型别名中的详细类型说明符

C++ 类型别名中的详细类型说明符,c++,c++11,types,language-lawyer,C++,C++11,Types,Language Lawyer,为什么下面的代码中没有硬错误?类型别名和类名称完全相同(编译器clang): 以下代码(符号或类型别名)中变量的定义中确切使用了哪个名称 第一个是对C的保留,其中标记名称空间(struct/union/enum)与typename名称空间(typedef和内置类型)完全分离。 在C++中,规则是宽松的,所以如果在类型名命名空间中没有任何东西,则自动搜索标签命名空间。< /P> 通过考虑第一个问题的答案来回答第二个问题: 找到类型名 下面的代码使S成为名为S的结构的别名。使用S将名称S重新定义为

为什么下面的代码中没有硬错误?类型别名和类名称完全相同(编译器
clang
):

以下代码(符号或类型别名)中变量的定义中确切使用了哪个名称

  • 第一个是对C的保留,其中标记名称空间(struct/union/enum)与typename名称空间(typedef和内置类型)完全分离。
    在C++中,规则是宽松的,所以如果在类型名命名空间中没有任何东西,则自动搜索标签命名空间。< /P>
  • 通过考虑第一个问题的答案来回答第二个问题:
    找到类型名


  • 下面的代码使
    S
    成为名为
    S
    的结构的别名。
    使用S
    将名称
    S
    重新定义为
    struct S
    的别名

    using S = struct S;
    
    struct S {};
    
    下一行定义了
    struct S

    using S = struct S;
    
    struct S {};
    
    下面的声明使用
    S
    作为
    S
    的别名

    至少可以说,这类似于

    using K = struct S;
    
    struct S { S(){ std::cout << "Constructed!\n"; } };
    
    K s;
    
    int main()
    {    }
    
    基本上,名称
    K
    将替换为
    struct S

    using S = struct S;
    
    struct S {};
    

    对于第二个示例,它本质上与C的
    typedef
    相同:

    typedef struct C {} C;
    

    这在C++

    中只是多余的,因为C及其
    typedef结构{}S
    使用S=struct S
    不隐藏,但将
    S
    重新定义为typedef名称和类名(具有两个属性的单个名称)。你经常会听到人们说
    使用S=struct S引入两个名称,C++将搜索多个“符号空间”,但这不是它在C++中的工作方式。关于这一点的深入讨论可以在.WRT 1中找到。因此,类型别名的功能类似于
    #define
    ?只是一个文本替换?不太像那样,那么就不会有两个不同的名称空间。无论如何,define是邪恶的在两个不同的查找表中引入两个名称(从编译器的角度看)?