最近,我看到了一个奇怪的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/

10-13 08:35