这可能是一个初学者语法问题,但我在 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()'
}
Run Code Online (Sandbox Code Playgroud)
C++ 运算符优先级表示范围解析运算符 ( ::) 具有最高优先级。
那么为什么 1) 和 2) 可以正常工作,但 4) 却不行?
您对运算符优先级的假设是正确的,直观上您是对的,不影响优先级的额外括号应该不重要。但是,明确禁止使用插入的括号来形成成员指针。唯一允许的形式&后跟成员的限定名称(也不允许使用非限定名称)。
请参阅[expr.unary.op]/4(在 C++20 后的标准草案中)。
在 中2),您没有形成成员指针,而是形成普通函数指针,因为sm是静态成员函数。所以我提到的规则并不适用。