为什么以下代码中没有硬错误?类型别名和类名完全相同(编译器clang
):
using S = struct S;
struct S {};
S s;
int main()
{
}
以下代码(符号或类型别名)中变量定义中使用的名称是什么?
using S = struct S {};
int main()
{
S s;
}
答案 0 :(得分:2)
第一个是来自C的保留,其中tag-namespace(struct / union / enum)与typename-namespace(typedef和builtin types)完全分开。
在C ++中,规则是放宽的,因此如果typename-namespace中没有任何内容,则会自动搜索tag-namespace。
第二个是通过考虑第一个答案来回答:
找到了typename。
答案 1 :(得分:2)
以下代码使S
成为名为S
的 struct 的别名。 using S
将名称S
重新定义为struct S
的别名。
using S = struct S;
以下行定义了struct S
。
struct S {};
下面的声明使用S
作为使用制作的S
的别名。
S s;
至少可以说,这类似于
using K = struct S;
struct S { S(){ std::cout << "Constructed!\n"; } };
K s;
int main()
{ }
代码将打印:
Constructed!
基本上,K
名称将替换为struct S
。
对于你的第二个例子,它本质上与C&#39 {s} typedef
相同:
typedef struct C {} C;
在C ++中简直是多余的