Answers:
注入的类名意味着X
被声明为的成员X
,因此内部的名称查找X
始终会找到当前类,而不是X
在同一封闭范围内声明的另一个类,例如
void X() { }
class X {
public:
static X create() { return X(); }
};
是create()
函数创建一个临时X
对象或调用函数X
?在名称空间范围内,它将调用该函数,因此,注入的类名的目的是确保在X
名称主体内始终能够找到类本身(因为名称查找是在类的自身范围内开始的,然后才查找封闭的内容)范围)。
这在类模板内部也很有用,在这种情况下,可以在没有模板参数列表的情况下使用注入的类名,例如,仅使用Foo
而不是完整的template-id Foo<blah, blah, blah>
,因此可以轻松地引用当前实例。有关澄清了C ++ 98和C ++ 03之间的更改,请参阅DR 176。
在C ++ 98中存在注入类名的想法,但该术语对于C ++ 03是新的。
C ++ 98说:
在看到类名之后,立即将一个类名插入到声明该类名的范围中。类名也插入到类本身的范围内。
第二句由DR 147更改,因此C ++ 03在[class] / 2中说:
在看到类名之后,立即将一个类名插入到声明该类名的范围中。的类名也被插入到类本身的范围; 这就是所谓的Injection-class-name。
即使在C ++ 98之前,ARM的措词也大致相同,这意味着可以始终在类主体中使用该类的名称来引用该类本身:
即使在类说明符本身的成员列表中,类的名称也可以用作类名称。
- 例如,
class link { link* next; };