Я думаю, что ваш пример использования довольно хорош. Потому что, если бы вы использовали обычный указатель на функцию, а затем применили оператор address-of, вы бы получили адрес указателя на функцию. Использование ссылки на функцию сделает ожидаемое, поскольку она возвращает указатель на саму функцию.
Я тоже не могу придумать много примеров. Как вы указали, сохранение ссылок на функции имеет некоторые ужасные последствия. Другим, возможно, нежелательным следствием является то, что если вы сохраните его в качестве члена класса, ваши объекты не будут назначаться, если вы не напишите свой собственный оператор = и воздержитесь от попыток переназначить ссылку на функцию.
Я думаю, что большинство использований ссылок на функции являются неявными, очень похоже на большинство применений ссылок на массивы - хотя намного больше, когда вы принимаете аргументы путем ссылки:
template<typename T>
void do_something(T const& t) { ... }
Хотя прием массивов по ссылке имеет преимущество, заключающееся в том, что они не теряют информацию о размере, но явный прием функций по ссылке явно не имеет преимущества (по крайней мере, насколько я могу видеть). Я полагаю, что существование ссылок на функции в значительной степени оправдано идеалистическим представлением ссылки как псевдонима -наименования некоторого объекта или функции, а также тем фактом, что она позволяет передавать функции в такие шаблоны, которые принимают их аргумент. по ссылке.
Я бы, вероятно, избегал их использования, если бы не нуждался в них неизбежно. Указатели на постоянные функции также предоставляют не подлежащие переназначению функции вызова и, вероятно, позволят избежать путаницы, когда другие программисты, которые, возможно, не очень знакомы с этими языковыми нишами, читают ваш код. Стоит отметить, что Vandervoorde & Josuttis также рекомендуют избегать их, чтобы уменьшить путаницу (в своей книге «Шаблоны C ++ - Полное руководство»).