【发布时间】:2011-10-31 08:18:59
【问题描述】:
在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 造成的,它显示
仅当使用显式 & 且其操作数是未括在括号中的限定 ID [...]
时才会形成指向成员的指针
有人知道为什么规范有这个规则吗?它特定于指向成员的指针,所以我怀疑这解决了一些语法歧义,但老实说,我一点也不知道它可能是什么。
【问题讨论】:
-
@Hans:不是重复的。 OP 实际上是该问题的评分最高的答案,它询问 什么 问题是什么。这个问题是问为什么。
-
@Troubadour:某事的 WHY 与 WHAT 和 HOW 不同。例如,what-question“唐老鸭穿什么样的裤子?”答案是“他下半身赤身裸体”,但如果你问“为什么唐老鸭下身赤身裸体”的问题,那就是另一个答案,即“他是一只鸭子”。简而言之,如果您问“唐老鸭穿什么样的裤子”,那么说“他是鸭子”是不是的有效答案。如您所见,2 diff q 与 2 diff a。干杯,
-
@Troubador- 我不打算让这成为您问题的重复。我对您的问题的解释是“这个问题的根本原因是什么”,而不是“为什么 C++ 采用这种结构”,所以我问这个问题是为了得到后一个问题的答案。如果我误读了您最初的问题并在此重复,我深表歉意。
-
原来的问题是为什么。 templatetypedef 似乎将其误解为“什么”,这很愚蠢,因为最初的问题是“在获取非静态成员函数的地址时不允许使用括号的原因是什么?”这简直是个骗局。
-
@templatetypedef:这不是 Troubador 的问题。游吟诗人没有问题。
标签: c++ language-lawyer pointer-to-member