带括号 &(A::m) 的非静态成员函数地址不起作用?

2024-03-10

这可能是一个初学者语法问题,但我在 SO 中找不到。

#include<iostream>
class A
{
  public:
     static void sm(){}
     void m(){}
};
int main()
{
    void (*fp1)() = &A::sm;     // 1) fine.
    void (*fp2)() = &(A::sm);   // 2) fine.


    void (A::*fp3)() = &A::m;   // 3) fine.
    void (A::*fp4)() = &(A::m); // 4) error: invalid use of non-static member function 'void A::m()'
}

C++ 运算符优先级 https://en.cppreference.com/w/cpp/language/operator_precedence范围解析运算符表示(::) 具有最高优先级。

那么为什么 1) 和 2) 可以正常工作,但 4) 却不行?


您对运算符优先级的假设是正确的,直观上您是对的,不影响优先级的额外括号应该不重要。然而,明确禁止使用插入的括号来形成成员指针。唯一允许的形式是&后跟成员的限定名称(也不允许使用非限定名称)。

See [expr.unary.op]/4 https://timsong-cpp.github.io/cppwp/n4868/expr.unary.op#4(在 C++20 后的标准草案中)。

In 2),你没有形成一个成员指针,而是一个普通的函数指针,因为sm是静态成员函数。所以我提到的规则并不适用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带括号 &(A::m) 的非静态成员函数地址不起作用? 的相关文章

随机推荐