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

标签 c++ language-lawyer pointer-to-member

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/

相关文章:

c++ - 如何将成员函数指针传递给模板函数中的重载方法?

c++ - 如何在类中将函数作为参数传递?

c++ - 指向成员奇怪声明的指针

c++ - 函数正确执行后如何修复 Core Dumped 错误?

c++ - 将每个值传递到数组中

c++ - 如何递归地将十六进制转换为十进制

c++ - 是否有一个函数可以将每个 double 转换为唯一的 uint64_t,同时保持精度和 ORDER? (为什么我找不到?)

c++ - 为什么可以临时调用成员函数而全局函数不能?

c++ - 我可以克隆 C++ 对象的字节,覆盖原始字节,然后将这些字节复制回来吗?

c++ - 为什么允许 int 和 const int 的不同转换函数?