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++规范中,这样的地方会被解决吗?
(顺便说一句,这个问题与我几分钟前发布的其他问题完全无关.)
与自己.
与您的其他问题不同,这个问题可以通过一些示例代码来解决.我将你的问题中的代码插入在线编译器(clang)......
编译器的响应非常明确:
警告:引用'anyName'在其自己的初始化中使用时尚未绑定到某个值
(尝试注释掉你的child anyName;行;注意编译结果不会改变,因为编译器无论如何都没有找到该对象.)
适用的C++标准规则[basic.lookup.unqual]如下:
X查找类的静态数据成员(在静态成员的qualified-id之后)的定义中使用的名称,就好像该名称是在成员函数中使用的一样X.
从 [basic.scope.pdecl]
声明的声明就在其完整的声明者之后和初始化者之前(如果有的话),除非如下所述.
这两个规则共同确保初始化的不合格查找anyName认定anotherClass::anyName.
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |