В случае указателя на функцию в C ++ есть специальное правило, разрешающее своего рода поиск во времени. Он может выполнять разрешение перегрузки для имени, основываясь на том, что вы собираетесь назначить / инициализировать имя.
Это в основном хак, встроенный в язык (правила в [over.over] ).
Никакая другая часть языка не работает таким образом. Например, если новички часто ожидают, что после написания float x = 1/2
значение x
будет 0.5
, мы должны объяснить, что факт инициализации float
не имеет отношения к типам или вычислениям выражение 1/2
.
Этот хак не был расширен до std::function
. Предположительно, это потому, что добавление хаков - это плохо, и потому что это не нужно для этого случая. Почему бы нет? Потому что вы все еще можете развернуть хак косвенно с помощью static_cast
на RHS вашей std::function
инициализации:
std::function<int(int, int)> fn = static_cast<int(*)(int, int)>(add);
… и есть ваш обходной путь.