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

时间:2018-08-23 23:20:06

标签: 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

当我使用anotherClass::anyName初始化上面的anyName引用时,我使用哪个anyName进行初始化?子类对象还是本身? (最后一行中的最后一个anyName指向哪个实体?它是模棱两可的吗?)在C ++规范中将如何解决此类问题?

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

1 个答案:

答案 0 :(得分:5)

本身。

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

http://rextester.com/EDW85421

编译器的响应非常清楚:

  

警告:引用“ anyName”在其自身的初始化中使用时尚未绑定到值

(尝试注释掉child anyName;行;请注意编译结果不会改变,因为编译器始终找不到该对象。)

适用于C ++标准的规则在[basic.lookup.unqual]中:

  

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

和来自X

  

名称的声明点紧随其完整的声明器之后且其初始值设定项(如果有)之前,除非另有说明。

这两个规则共同确保[basic.scope.pdecl]的初始化程序的不合格查找找到anyName