Возможный дубликат:
Ошибка с адресом круглой функции-члена
В этот недавний вопрос OP столкнулся с странным положением языка С++, что делает его незаконным для принятия адреса функции-члена, если это имя функции-члена круглые скобки. Например, этот код является незаконным:
struct X {
void foo();
};
int main() {
void (X::* ptr)();
ptr = &(X::foo); // Illegal; must be &X::foo
}
Я просмотрел это и обнаружил, что он из-за § 5.3.1/3 спецификации С++ ISO, который читает
Указатель на член формируется только тогда, когда явный и используется, а его операнд - это идентификатор, не заключенный в круглые скобки [...]
Есть ли у кого-нибудь идеи, почему спецификация имеет это правило? Это специфично для указателей на член, поэтому я бы заподозрил, что есть некоторая грамматическая двусмысленность, которая это решает, но я, честно говоря, не имею ни малейшего представления о том, что это может быть.