Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>Имхо, причина там одна — не дать возможность объявления объекта, который имеет 'function type'. В качестве альтернативы можно рассмотреть случай когда такая конструкция приводит к декларации функции, как и в случае c 8.3.5/7. Но это может привести к сюрпризам, т.к. инстанцирование шаблона функциональным типом и любым другим будет приводить к совершенно разным последствиям. Т.е. здесь как мне кажется имеет место "принцип наименьшего удивления": конструкция вида 'T f;' предствляет собой 'object declaration' и только ее, а попытка использования в качестве 'T' функционального типа приводит к ошибке.
Спасибо.
ЮЖ>В случае же с независимыми типами, декларация функции в этом случае — осмысленный шаг со стороны программиста (и результат ни от чего не зависит).
Руководствуясь тем, что IS нацелен больше на разработчиков транслторов, чем на рядовых программистов, префразирую:
Независимый тип известен при определении шаблона и используется в проверке синтаксиса. Зависимый тип станет известен позже при инстанциации.
Что бы исключить какие-то сложности/неоднозначности при определении шаблона, стандарт делает запрет явно. VC не особо проверяет синтаксис внутри шаблона до инстанциации, поэтому успешно транслирует ill-formed example из 14.3.1/3.
ЮЖ>Тип для 'F' будет выведен как 'void()', соответственно тип 'ptr' будет 'void(*)()', что соответствует типу выражения '&helper'. Т.е. никаких проблем быть не должно.
Ситуация не стандартна из-за разных конвенциий вызова.
ЮЖ>А здесь точно именно этого требуется?
К сожалению, автор кода не дал ответа на этот вопрос. Что-то связанное с выводом сигнатуры функций.
Мне кажется, каждый встречающийся в объявлении функции тип выводят по отдедьности, стремясь к:
RT f(A);
что не может попасть под ограничение. Как следствие усомнился, что формулировка стандарта безупречна, как минимум для моего понимания.