具有不同范围的其他相同名称的C++名称解析规则

pho*_*ger 3 c++ language-lawyer name-lookup

我意识到以下是可怕的风格,但为了争论,假设我有以下代码:

struct parent
{
   virtual ~parent() {}
};

struct child : public parent
{
   child() {}
   virtual ~child() {}
};

struct anotherClass
{
   static parent& anyName;
};

child anyName; // create an instance of 'child'
parent& anotherClass::anyName = anyName; // create a parent-class ref to the child object
Run Code Online (Sandbox Code Playgroud)

当我初始化anotherClass::anyName上面的参考时,我用anyName它anyName初始化它?子类对象,还是自己?(anyName最后一行中的最后一个实体引用哪个实体?它是不明确的吗?)在C++规范中,这样的地方会被解决吗?

(顺便说一句,这个问题与我几分钟前发布的其他问题完全无关.)

Ben*_*igt 5

与自己.

与您的其他问题不同,这个问题可以通过一些示例代码来解决.我将你的问题中的代码插入在线编译器(clang)......

http://rextester.com/EDW85421

编译器的响应非常明确:

警告:引用'anyName'在其自己的初始化中使用时尚未绑定到某个值

(尝试注释掉你的child anyName;行;注意编译结果不会改变,因为编译器无论如何都没有找到该对象.)

适用的C++标准规则[basic.lookup.unqual]如下:

X查找类的静态数据成员(在静态成员的qualified-id之后)的定义中使用的名称,就好像该名称是在成员函数中使用的一样X.

从 [basic.scope.pdecl]

声明的声明就在其完整的声明者之后和初始化者之前(如果有的话),除非如下所述.

这两个规则共同确保初始化的不合格查找anyName认定anotherClass::anyName.