这个问题的答案让我想知道以下几点:
我假设定义一个类如下:
typedef class {int i;} C;
将完全等同于以传统方式定义它:
class C
{
int i;
};
这个假设正确吗?
这个问题的答案让我想知道以下几点:
我假设定义一个类如下:
typedef class {int i;} C;
将完全等同于以传统方式定义它:
class C
{
int i;
};
这个假设正确吗?
在这个孤立的例子中,它们在功能上是相同的,至少从外部来看是相同的。
但是也有区别。特别是一个实例,您不能以这种方式声明 astruct
或 a的构造函数class
,仅仅因为class
未命名。同样,您不能声明任何涉及类名的函数。这里有些例子:
typedef class
{
public:
Gizmo() : n_(42) {}; // NOT OK
~Gizmo();
Gizmo& operator<<(int n);
private:
int n_;
} Gizmo;
您也不能转发声明匿名类:
class Gizmo;
在 C++ 中,我从未见过typedef
使用匿名struct
或 aclass
比简单地声明命名的 aclass
或a 更可取的情况。struct
在某些情况下,传统方法绝对是首选。这个故事的寓意是:不要typedef class {} Name;
在 C++ 中使用。它什么也没有给你买,却让你付出了一些代价。
从实际的角度来看是的,因为标准说 (9.1/5)
命名类类型或其 cv 限定版本的 typedef-name (7.1.3) 也是 > 类名。如果在需要类名的地方使用命名 cv 限定类类型的 typedef-name,则忽略 cv 限定符。
7.1/3 说:
使用 typedef 说明符声明的名称成为 typedef-name。在其声明的范围内,typedef-name 在语法上等同于关键字,并以第 8 节中描述的方式命名与标识符相关联的类型。因此 typedef-name 是另一种类型的同义词。
从理论上讲不是,因为您可以(实际上我看到人们已经拥有)根据使用的版本起草有效或无效的程序,因为 7.1/3 继续从我切断它的地方说:
typedef-name 不会像类声明 (9.1) 或枚举声明那样引入新类型。
我相信这是一个重复的问题(找不到),但如果不是,请注意编译:
class C
{
int i;
};
void C() {}
class C x;
虽然这不会:
typedef class
{
int i;
} C;
void C() {}
C x;
名称空间不同。
它们不是等价的。尤其,
int main()
{
class C c;
}
只会编译两个定义之一。
这是另一个区别:后者可以前向声明,前者不能。