可能重复:
带括号的成员函数的地址错误
在最近的这个问题中,OP 遇到了 C++ 语言的一个奇怪规定,如果该成员函数名称带有括号,则获取成员函数的地址是非法的。例如,此代码是非法的:
struct X {
void foo();
};
int main() {
void (X::* ptr)();
ptr = &(X::foo); // Illegal; must be &X::foo
}
我查了一下,发现这是由于 C++ ISO 规范的 §5.3.1/3 造成的,它的内容如下
仅当使用显式 & 并且其操作数是未包含在括号中的限定 ID 时,才会形成指向成员的指针 [...]
有谁知道为什么规范有这个规则?它特定于指向成员的指针,所以我怀疑这解决了一些语法歧义,但老实说,我一点也不知道它可能是什么。