Это ожидаемое поведение. zp
- это указатель (a Z *
), а operator()
перегружен для Z
, а не Z *
. Когда вы обращаетесь к указателю с помощью *zp
, вы получаете Z &
, для которого operator()
перегружено .
К сожалению, вы не можете перегрузить оператор для типа указателя (я думаю, что это как-то связано с тем, что указатели не являются пользовательскими типами, но у меня нет Стандарта передо мной). Вы можете упростить синтаксис с помощью ссылок:
Z & r = *zp;
r(3);