gpt4 book ai didi

c++ - 关于 C++ 运算符 "address of"和 "scope resolution"优先级的问题

转载 作者:IT老高 更新时间:2023-10-28 21:35:44 25 4
gpt4 key购买 nike

您好,我的代码存在编译器错误(错误来自 Microsoft Visual Studio 2008):

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'
};

虽然这段代码没有错误:

class B {
protected:
int b;
};

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

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

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

有什么解释吗?

最佳答案

在第一种情况下,您将获取指向成员 B::b 的指针的地址。由于这样的指针不是 A 的父级的成员,而是一个单独的对象,它不能通过 protected 机制访问它。

在它工作的第二种情况下,您要求提供 b特定实例 的地址,并使用其基类对其进行限定,以便在以下情况下多重继承编译器会知道你的意思是哪个基类。在这种情况下, protected 属性是可见的。

请注意,这是编译:

class B
{
protected:
int b;
};

class A : public B
{
public:
void foo(){ &A::b; } // Note here &A:: instead of &B::
};

作为一个附加示例,它不起作用的原因与以下(希望更熟悉)代码不起作用的原因相同:

class B
{
protected:
int b;
};

class A : public B
{
public:
void foo(const B* b_obj) { b_obj->b; }
};

关于c++ - 关于 C++ 运算符 "address of"和 "scope resolution"优先级的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com