我为什么要重新定义; 不同的基本类型?

Meh*_*dad 2 c++ visual-c++

当我在Visual C++中尝试这个时,为什么会出现错误?

struct S { };
typedef S *S;
Run Code Online (Sandbox Code Playgroud)

不是C++ 会给你typedef一个以前只被声明为class或者名字的名字struct吗?
或者我误解了发生了什么?

AnT*_*AnT 5

C++允许您键入现有的类名,但只能以非常有限的方式.一旦你宣布struct S你可以做到

typedef struct S S;
Run Code Online (Sandbox Code Playgroud)

但你做不到

typedef struct S *S; // ERROR
Run Code Online (Sandbox Code Playgroud)

要么

typedef int S; // ERROR
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,您重新定义S指针的事实是打破它的原因.

语言规范在7.1.3/2中说明

在给定的非类作用域中,可以使用typedef说明符重新定义该作用域中声明的任何类型的名称,以引用它已引用的类型.

"已经提到"是关键部分.简单来说,您可以将类名重新定义为代表相同的类类型,但不能指向类类型或其他任何类型的指针.


上面提到的C++标准部分也允许你编写重复的typedef

typedef int T;
typedef int T;
typedef int T;
Run Code Online (Sandbox Code Playgroud)

这在C中是非法的