4

根据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了?

4

2 回答 2

6

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

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

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

于 2020-01-28T20:03:50.230 回答
4

::X在全局命名空间中搜索此限定名称。由于没有具有这样名称的类型(变量声明隐藏了 type 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
    }
};
于 2020-01-28T20:02:44.240 回答