Re[6]: Ограничения template type arguments
От: Anonim547  
Дата: 02.02.10 23:03
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Имхо, причина там одна — не дать возможность объявления объекта, который имеет '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);

что не может попасть под ограничение. Как следствие усомнился, что формулировка стандарта безупречна, как минимум для моего понимания.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.