Вы можете думать, что указатель функции является адресом первой инструкции в машинный код этой функции. Любой указатель можно рассматривать как bool
: 0 - false, а все остальное - true. Как вы заметили, при нажатии на void *
и заданной в качестве аргумента для оператора вставки потока (<<
), адрес печатается. (Показать строго, приведение указателя к функции в void *
не определено.)
Без трансляции история немного сложна. Для сопоставления перегруженных функций («разрешение перегрузки») компилятор C ++ собирает набор функций-кандидатов, и из этих кандидатов выбирает «наилучшую жизнеспособную», используя при необходимости неявные преобразования. Морщинка - это правила сопоставления, которые образуют частичный порядок, поэтому множественные наиболее эффективные совпадения вызывают ошибку двусмысленности.
В порядке предпочтения стандартные преобразования (и, конечно, также конверсии, определяемые пользователем и многоточие, не подробные) являются
int
to float
) Последняя категория включает в себя логические преобразования, и любой тип указателя может быть преобразован в bool
: 0 (или NULL
]) - false
, а все остальное - true
. Последний отображается как 1
, когда передается оператору вставки потока.
Вместо этого вместо 0
измените свою инициализацию на
pf = 0;
. Помните, что инициализация указателя с нулевое константное выражение дает нулевой указатель.
Nevermind. Я смог решить проблему, удалив все соединения и поставив их снова.
Что-то странное с моей стороны.