В эффективный C++, пункт 35 автор вводит шаблон стратегии через указатели на функции. Специально на странице 172
class GameCharacter;
int defaultHealthCalc(const GameCharacter& gc);
class GameCharacter {
public:
typedef int (*HealthCalcFunc)(const GameCharacter&);
explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)//why not &defaultHealthCalc?
: healthFunc(hcf)
{}
int healthValue() const
{ return healthFunc(*this); }
...
private:
HealthCalcFunc healthFunc;
};
В шестой строке, почему указателю функции HealthCalcFunc
присваивается значение defaultHealthCalc
вместо &defaultHealthCalc
?
Поскольку компилятор знает, что вы присваиваете значение указателю на функцию, достаточно указать имя нужной функции - синтаксис однозначен.
Если вы хотите добавить амперсанд, чтобы было понятно, синтаксис позволяет это, но в этом нет необходимости.
Точно так же при вызове функции из указателя вы можете либо использовать имя указателя напрямую (как это сделано в примере кода), либо явно разыменовать его с помощью оператора '*'. В любом случае компилятор знает, что вы имеете в виду.