当 Injected-Class-Name 发生时会发生什么?(C++)

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

Nat*_*ica 6

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

基本上。名称查找规则从最窄的范围开始。当您执行X* p;in 时f,查看 inf的范围并没有找到任何内容。然后它检查X的作用域,因为f它的作用域是X。它发现,X因为它被注入到类作用域中,所以它停在那里,你得到了类类型。

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