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

时间:2016-10-29 10:48:13

标签: c++ c++11 types language-lawyer

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

using S = struct S;

struct S {};

S s;

int main()
{
}

以下代码(符号或类型别名)中变量定义中使用的名称是什么?

using S = struct S {};

int main()
{
    S s;
}

2 个答案:

答案 0 :(得分:2)

  1. 第一个是来自C的保留,其中tag-namespace(struct / union / enum)与typename-namespace(typedef和builtin types)完全分开。
    在C ++中,规则是放宽的,因此如果typename-namespace中没有任何内容,则会自动搜索tag-namespace。

  2. 第二个是通过考虑第一个答案来回答:
    找到了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 ++中简直是多余的