我意识到以下是可怕的风格,但为了论证,假设我有以下代码:
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 完全无关。)
最佳答案
自身。
与您的其他问题不同,这个问题可以通过一些示例代码来解决。我将您问题中的代码插入在线编译器(clang)...
http://rextester.com/EDW85421
编译器的响应非常明确:
(尝试注释掉你的 child anyName;
行;注意编译结果不会改变,因为编译器无论如何都没有找到那个对象。)
适用于 C++ 标准的规则在 [basic.lookup.unqual]
中:
来自 [basic.scope.pdecl]
这两条规则共同确保初始化程序对 anyName
的非限定查找找到 anotherClass::anyName
。
关于C++ 名称解析规则,用于其他范围不同的相同名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51995500/