最近,我看到了一个奇怪的C++功能:注入(inject)的类名。
class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...
但我不知道为什么需要此功能。是否有任何实践需要此功能?
我听说在旧的C++中不存在此功能。那么,什么时候引入的呢? C++ 03? C++ 11?
最佳答案
注入(inject)的类名称意味着X
被声明为X
的成员,因此X
中的名称查找始终会找到当前类,而不是可能在同一封闭范围内声明的另一个X
,例如
void X() { }
class X {
public:
static X create() { return X(); }
};
create()
函数是创建临时X
对象还是调用函数X
?在 namespace 范围内,它将调用该函数,因此,注入(inject)的类名称的目的是确保在X
主体内,该名称始终能够找到该类本身(因为名称查找始于该类自己的范围,然后才在该类的范围内查找)。封闭范围)。这在类模板内部也很有用,在这种情况下,可以在没有模板参数列表的情况下使用注入(inject)的类名,例如仅使用
Foo
而不是完整的template-id Foo<blah, blah, blah>
,因此很容易引用当前实例。请参阅DR 176,以了解在C++ 98和C++ 03之间的更改。在C++ 98中存在注入(inject)类名的想法,但是该术语对于C++ 03是新的。
C++ 98说:
第二句话由DR 147更改,因此C++ 03在[class]/2中说:
即使在C++ 98之前,ARM的措词也大致相同,这意味着可以在类主体中始终使用类的名称来引用类本身:
关于c++ - 为什么会有注入(inject)的类名?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58980954/