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++ - 延长临时生命周期,适用于 block 范围的聚合,但不能通过 `new` ;为什么?

c++ - Crazy C++ 模板 - 访问类的各个属性的模板

c++ - 返回对/结构/元组时参数的顺序在下面的代码中重要吗?

c++ - 通过从 std::function 隐式转换从 nullptr_t 到类型的转换

c++ - 成员函数作为 map 比较器?

c++ - 当有许多函数要导入时替代 `LoadPackagedLibrary`

c++ - 为什么只有与int变量一起使用时std cin才能工作?

c++ - 从两个不同的字段中排序并确定唯一性的容器