Ответ 1
Тип pointer-to-member-function
отличается от pointer-to-function
.
Тип функции различен в зависимости от того, является ли она обычной функцией или нестатической функцией-членом для некоторого класса:
int f(int x);
the type is "int (*)(int)" // since it is an ordinary function
И
int Mat::f2(int x);
the type is "int (Mat::*)(int)" // since it is a non-static member function of class Mat
Примечание: если это статическая функция-член класса Fred, то ее тип такой же, как если бы это была обычная функция: "int (*)(char,float)"
В С++ функции-члены имеют неявный параметр, который указывает на объект (этот указатель внутри функции-члена). Нормальный C функции могут рассматриваться как имеющие другое соглашение о созыве от функций-членов, , поэтому типы их указателей (указатель-член-функция против указателя на функцию) различны и несовместимый. С++ вводит новый тип указателя, , называемый указатель-к-члену, который может быть вызван только путем предоставления объекта.
ПРИМЕЧАНИЕ. Не пытайтесь "отличить" функцию "указатель-член" в указатель на функцию; результат undefined и, вероятно, катастрофический. Например, функция-указатель-член не требуется содержать машинный адрес соответствующей функции. Как было сказано в последнем Например, если у вас есть указатель на регулярную функцию C, используйте либо функция верхнего уровня (нечлена) или статическая (класс) функция-член.