csg*_*guy 4 c++ scope class name-lookup injected-class-name
根据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
}
};
Run Code Online (Sandbox Code Playgroud)
那么代码中到底发生了什么?是X* p变成了X::X* p?
那么代码中到底发生了什么?X* p 是否变成了
X::X*p?
基本上。名称查找规则从最窄的范围开始。当您执行X* p;in 时f,查看 inf的范围并没有找到任何内容。然后它检查X的作用域,因为f它的作用域是X。它发现,X因为它被注入到类作用域中,所以它停在那里,你得到了类类型。
当你这样做时,::X* q;然后::X说X在全局命名空间中查找,并且找到了一个变量,而不是一个类型,所以你会得到一个错误。