关于c ++:使用typedef和匿名类定义与传统类定义的等效性

Equivalancy of using typedef and an anonymous class definition to conventional class definition

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Difference between ‘struct’ and ‘typedef struct’ in C++?

这个问题的答案使我对以下问题产生了疑问:

我假设定义一个类如下:

1
typedef class {int i;} C;

完全等同于以传统方式定义:

1
2
3
4
class C
{
   int i;
};

这个假设正确吗?


在这个孤立的例子中,它们在功能上是相同的,至少从外部来说是一样的。

但也存在差异。尤其是在一个实例中,不能以这种方式声明structclass的构造函数,因为class未命名。同样,不能声明任何涉及类名称的函数。以下是一些例子:

1
2
3
4
5
6
7
8
9
typedef class
{
public:
  Gizmo() : n_(42) {}; // NOT OK
  ~Gizmo();
  Gizmo& operator<<(int n);    
private:
  int n_;
} Gizmo;

您也不能转发声明匿名类:

1
class Gizmo;

在C++中,我从未见过一个EDCOX1(3)使用匿名EDCOX1(0)或EDOCX1×1 }的情况,这比简单地声明命名为EDCOX1×1或EDCOX1×0的情况更好。在某些情况下,传统方法是绝对首选的。这个故事的寓意是:在C++中不要使用EDCOX1 8。它什么都不给你买,也要你花点钱。


我认为这是一个重复的问题(找不到),但如果找不到,请注意,这编译了:

1
2
3
4
5
6
7
class C
{
   int i;
};
void C() {}

class C x;

虽然这不会:

1
2
3
4
5
6
7
typedef class
{
   int i;
} C;
void C() {}

C x;

名称空间不同。


从实践的角度来看,是的,因为标准规定(9.1/5)

A typedef-name (7.1.3) that names a class type, or a cv-qualified version thereof, is also > a class-name. If a typedef-name that names a cv-qualified class type is used where a
class-name is required, the cv-qualifiers are ignored.

7.1/3表示:

A name declared with the typedef specifier becomes a typedef-name.
Within the scope of its declaration, a typedef-name is syntactically
equivalent to a keyword and names the type associated with the
identifier in the way described in Clause 8. A typedef-name is thus a
synonym for another type.

从理论上来说,不,因为你可以(实际上我看到人们已经有)根据使用的版本来起草有效或无效的程序,因为7.1/3从我截去的地方继续说:

A typedef-name does
not introduce a new type the way a class declaration (9.1) or enum declaration does.


还有另一个区别:后者可以向前声明,前者不能。


它们不是等价的。特别地,

1
2
3
4
int main()
{
    class C c;
}

只编译两个定义中的一个。