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++中,规则是宽松的,所以如果在类型名命名空间中没有任何东西,则自动搜索标签命名空间。< /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是邪恶的代码>在两个不同的查找表中引入两个名称(从编译器的角度看)?