发生注入类名时会发生什么情况?(C++)

What happens when Injected-Class-Name occurs? (C++)

本文关键字:C++ 什么情况 注入      更新时间:2023-10-16

根据 https://en.cppreference.com/w/cpp/language/injected-class-name

在类作用域中,当前类的名称被视为 是公共成员名称;这称为注入类名。这 名称的声明点紧随开幕后 类定义的大括号。

int X;
struct X {
void f() {
X* p; // OK. X refers to the injected-class-name
::X* q; // Error: name lookup finds a variable name, which hides the struct name
}
};

那么代码中到底发生了什么呢?X* p变成了X::X* p吗?

那么代码中到底发生了什么?X* p 会变成X::X*p 吗?

基本上。 名称查找规则从最窄的范围开始。 当你在fX* p;时,它会在f的范围内查找,但找不到任何东西。 然后它会检查X的作用域,因为f的作用域为X。 它找到X因为它被注入到类作用域中,所以它停在那里,你得到类类型。

当你做::X* q;时,::X说在全局命名空间中查找X,并且找到一个变量,而不是一个类型,所以你得到一个错误。

此限定名称::X在全局命名空间中搜索。由于没有具有此类名称的类型(变量声明隐藏了类型struct X(,编译器会发出错误。

您可以使用一个精心设计的名称,例如

int X;
struct X {
void f() {
X* p; // OK. X refers to the injected-class-name
struct ::X* q; // OK. elaborated name struct ::X
}
};
相关文章: