成员函数指针的奇怪C规则? - 代码日志

成员函数指针的奇怪C规则?

Possible Duplicate:
07000

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)被允许为&(一元表达式),
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)符号,编译器就不需要了
处理成员类型。
由于成员类型始终以指针的形式处理,
我猜这个标准优先考虑了简化编译器的类型
系统一点点

http://stackoverflow.com/questions/7134261/strange-c-rule-for-member-function-pointers

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:成员函数指针的奇怪C规则?