首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于C++算子“地址”和“作用域归结”优先级的一个问题

关于C++算子“地址”和“作用域归结”优先级的一个问题
EN

Stack Overflow用户
提问于 2011-02-16 23:50:15
回答 3查看 555关注 0票数 23

你好,我有一个编译器错误的代码(错误来自Microsoft Visual Studio 2008):

代码语言:javascript
运行
复制
class B {
protected:
    int b;
};

class A : public B {
public:
    void foo() { &B::b; } 
// error C2248: 'B::b' : cannot access protected member declared in class 'B'
};

虽然这段代码是没有错误的:

代码语言:javascript
运行
复制
class B {
protected:
    int b;
};

class A : public B {
public:
    void foo() { &(B::b); }
};

根据我对运算符优先级的了解,这两个代码片段在我看来是等价的,因为::的优先级比&高(例如,请参阅"JOINT STRIKE FIGHTER AIR VEHICLE C++ CODING STANDARDS FOR THE SYSTEM DEVELOPMENT AND DEMONSTRATION PROGRAM“第137页的表2)。

但它们是不同的..。我认为它与“指向数据成员的指针”有关,但我不知道它如何符合运算符的优先顺序。

有什么解释吗?

EN

Stack Overflow用户

发布于 2011-02-17 01:07:44

这只是一个补充。

§5.3.1/2表示:

一元&运算符的结果是指向其操作数的指针。操作数应为左值或限定id。在第一种情况下,如果表达式的类型是“T”,则结果的类型是“指向T的指针”...

对于合格的id,...如果该成员是类型T的类C的非静态成员,则结果的类型是“指向类型T的类C的成员的指针”。

根据§5.1/7,B::b属于限定id的情况,但(B::b)不属于限定id的情况,所以编译器将其解释为左值。

票数 7
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5018603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档