我意识到以下内容很糟糕,但是为了争辩,假设我有以下代码:
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完全无关。)
答案 0 :(得分:5)
本身。
与您的其他问题不同,可以通过一些示例代码来解决此问题。我将您问题中的代码插入了在线编译器(clang)...
编译器的响应非常清楚:
警告:引用“ anyName”在其自身的初始化中使用时尚未绑定到值
(尝试注释掉child anyName;
行;请注意编译结果不会改变,因为编译器始终找不到该对象。)
适用于C ++标准的规则在[basic.lookup.unqual]
中:
查找在类
X
的静态数据成员中使用的名称(在该静态成员的qualified-id之后),就好像该名称是在{{1}的成员函数中使用的一样}。
和来自X
名称的声明点紧随其完整的声明器之后且其初始值设定项(如果有)之前,除非另有说明。
这两个规则共同确保[basic.scope.pdecl]
的初始化程序的不合格查找找到anyName
。