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