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; }; |
这个假设正确吗?
在这个孤立的例子中,它们在功能上是相同的,至少从外部来说是一样的。
但也存在差异。尤其是在一个实例中,不能以这种方式声明
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; } |
只编译两个定义中的一个。