为什么有一个注入类名?
最近我看到了一个奇怪的C ++特性: 注入类名 。
class X { }; X x1; class X::X x2; // class X::X is equal to X class X::X::X x3; // ...and so on...
但我不明白为什么这个function是必要的。 有没有需要这个function的练习?
我听说这个function在旧的C ++中不存在。 那么,什么时候推出? C ++ 03? C ++ 11?
注入的类名意味着X
被声明为X
的成员,所以X
内的名字查找总是find当前的类,而不是另一个可能在相同的封闭范围内声明的X
void X() { } class X { public: static X create() { return X(); } };
create()
函数是创build一个临时的X
对象还是调用函数X
? 在命名空间范围它将调用函数,所以注入类名的目的是为了确保在X
的主体内名称总是find类本身(因为名称查找开始在类的自己的范围之前查看附上范围)。
在类模板中也是有帮助的,在类模板中,注入的类名可以在没有模板参数列表的情况下使用,例如使用简单的Foo
代替完整的template-id Foo<blah, blah, blah>
,所以很容易引用当前的实例化。 请参阅DR 176以了解C ++ 98和C ++ 03之间的变化。
注入类名的想法是存在于C ++ 98中的,但是术语对于C ++ 03是新的。
C ++ 98说:
在看到类名后立即声明一个类名 。 类名也被插入到类本身的范围内。
第二句话被DR 147改变了,所以C ++ 03在[class] / 2中说:
在看到类名后立即声明一个类名 。 类名也被插入到类本身的范围中; 这被称为注入类的名称 。
即使在C ++ 98之前,ARM也具有大致相同的措辞,这意味着类的名称总是可以在类体中用来引用类本身:
即使在类说明符本身的成员列表中 , 类的名称也可以用作类名 。
- 例如,
class link { link* next; };