Здравствуйте, Roman Odaisky, Вы писали:
RO>Можно ли посмотреть на место в стандарте, регламентирующее поведение в такой ситуации? Так можно вообще?
Я думаю, что код является вполне корректным. Основные ограничения, накладываемые на типовые аргументы шаблона, перечислены в (14.3.1/2):
A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argumentfor a template type-parameter.
причем данные правила относится к
diagnosable rules (1.4/1), т.е. при их нарушении реализация обязаны выдать диагностику (1.4/2).
В приведенном же примере, в результате вывода аргументов шаблона, параметр
UnaryOperation получит значение
int (*)(int), которое является составным (compound) типом, включающим только фундаментальрные типы. К сожалению, я не смог найти в стандарте прямого указания на то, что фундаментальные типя обладают внешним связыванием, однако на это намекает определение из (3.5/2).
Существенно здесь то, что адрес функции без связывания передается только на стадии исполнения, на стадии же компиляции и компановки реализация имеет дело только с типами, обладающими внешним связыванием.