Possible Duplicate:
Error with address of parenthesized member function
在 this recent question 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 造成的,它显示
A pointer to member is only formed when an explicit & is used and its operand is a qualified-id not enclosed in parentheses [...]
有人知道为什么规范有这个规则吗?它特定于指向成员的指针,所以我怀疑这解决了一些语法歧义,但老实说,我一点也不知道它可能是什么。
最佳答案
这只是个人意见。
如果 &(qualified-id)
被允许作为 &(unary-expression)
,
qualified-id 必须是一个表达式,并且一个表达式应该有一个类型
(即使它不完整)。
但是,C++ 没有表示成员的类型,只有
指向成员的指针。
例如下面的代码无法编译。
struct A { int i; };
template< class T > void f( T* );
int main() {
(void) typeid( A::i );
f( &A::i );
}
为了使 &(qualified-id)
有效,编译器必须持有
内部的成员类型。
但是,如果我们放弃 &(qualified-id)
表示法,编译器就不需要
处理成员类型。
由于成员类型总是以指向它的指针的形式处理,
我猜标准优先简化编译器的类型
系统一点。
关于c++ - 成员函数指针的奇怪 C++ 规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7134261/