根据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::X::foo
这样的东西会出现的原因(类似于:https://dev59.com/lFYN5IYBdhLWcg3w2rSU?noredirect=1&lq=1)是因为 Injected-Class-Name 忽略了那些作用域查找,只是简单地使用 X::foo? - csguyclass_name::class_name
总是有效的,因为class_name::class_name
就是class_name
,你可以再次访问它的成员变量,一直这样继续下去,如X::X::X::X::X::X::X::X::X::X::X::X::f();
(如果你真的想这样做)。 - NathanOliver