c++ - 为什么我不能直接调用通过成员指针访问的实例的方法

标签 c++ pointer-to-member

例如我有一个内部类:

struct Foo {
  void test() {}
};

和一个外部类:

struct Bar {
  Foo foo;
};

然后在 main() 中:

  Bar bar{};
  Foo Bar::* pFoo = &Bar::foo;

  bar.*pFoo.test(); // does not work

  Foo foo = bar.*pFoo;
  foo.test(); // works;

关于bar.*pFoo.test()的错误是:member reference base type 'Foo Bar::*' is not a structure or union, 那是什么bar.*pFoo.test();Foo foo = bar.*pFoo; 的区别foo.test();?

最佳答案

正如评论中所暗示的那样,.* 的运算符优先级低于 ..

因此 bar.*pFoo.test(); 被解析为 bar.*(pFoo.test()); 并试图访问 pFoo 的测试 成员。

因为pFooFoo Bar::* 类型的成员指针,所以这不是一个有效的表达式。只有类类型可以出现在成员访问运算符 . 的左侧(除了伪析构函数调用语法),成员指针不是。

第二个示例等效于表达式 (bar.*pFoo).test(); 相反。

关于c++ - 为什么我不能直接调用通过成员指针访问的实例的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59136519/

相关文章:

c++ - 有什么方法可以使用 ASYNC MessageBox 吗?

c++ - 如何创建指向可变成员的指针?

c++ - 类复制构造函数和指向成员函数的指针

c++ - 为什么指向从基到派生的成员转换的指​​针会出错

c++ - 动态创建一个函数指针来调用给定实例上的方法

c++ - 将函数/方法指针推送到双端队列

c++ - 如何使用 Base 8(八进制)数字?

c++ - 计算列表中对象的出现次数

c++ - MinGW-w64 g++ 是否公开了 Microsoft ucrt 对 C11 `getenv_s` 函数的实现?如果是,要包含什么标题?

c++ - 连续固定长度子序列的最大差异