2013-06-21 47 views
7

有没有办法将类型的原始名称与该类型的typedef名称区分开来?区分C++ 11原始类型名称与typedef名称?

例如:

class C1 {}; 

typedef C1 C2; 

C1和C2二者现在命名相同的类型。在上述代码之后,是否曾经有过一种情况,其中涉及相关类型的名称C1的出现不能用C2代替(或反之亦然)?

回答

3

他们是完全难以区分typedef

5

typedef创建一个别名,并且它们不可区分为一个类型。另一方面,一些特定的语法结构需要实际的类型,而不是typedef-ed(构造函数/析构函数的声明/定义...),但这是一个不同的问题。作为一种类型,它们是无法区分的。

+0

您是否知道这是唯一的情况(构造函数/析构函数)? ie除构造函数/析构函数之外,其他的语法构造是什么? –

+0

@ user1131467有关'typedef'的更多信息,请参阅$ 7.1.3。关于您的评论$ 7.1.3/8和$ 7.1.6.3可能会进一步澄清。 –

+0

您可能想要阅读_injected类name_。在'C1'里面有一些特殊的命令来查找名字'C1'。但是由于'C2'命名同一个类,在'C2'中查找'C1'也是很特殊的。 OTOH,'C2'没有注入'C1'。 – MSalters

2

Complete Reference

“C允许你使用关键字的typedef你实际上并没有创建新的数据类型,但对于现有的,而定义一个新的名称,明确定义了新的数据类型的名称。类型。”

有趣的是(也许)C++ 1Y将实施一个强类型typededef(称为不透明的typedef),这是不可互换将基本名称:PDF Report

+1

+1对于C++ 1Y笔记。 :) –

0

是的,有这样的一个案件。您无法使用typedef转发声明类型。例如class C2;将无效。

除此之外,typedef创建一个标识类型别名,应该是完全等效的。

1

是的。由于C兼容性的原因,您可以明确地将class添加到C1:class C1 foo;,但class C2 foo;是非法的。

这样做的原因是C为结构和函数分别命名空间,因此您还可以使用函数void C1(int)。这不会引起歧义,因为每个结构名称必须以struct作为前缀。但是如果你输入了struct C1,那么typedef名称不允许为现有函数提供别名。