Рассмотрим следующий шаблонный класс
template<typename T>
struct Caller {
void func(const T &t) { t.func(); }
void gunc(const T &t) { t.gunc(); }
};
Теперь пусть некоторые класс Target
только обеспечить функцию-член func()
но нет gunc()
т.е.
struct Target {
void func() const { /* ... /* }
};
это создание шаблона Caller<Target>
действует?
GCC, clang, а также VC ++ принимают такие экземпляры шаблонов. Конечно зовет Caller<Target>::gunc()
приводит к ошибке, но Caller<Target>::func()
работает просто отлично и как задумано.
Теперь вопрос: Каковы предпосылки для этого разрешающего поведения и где находятся соответствующие параграфы в стандарте C ++.
Это определено в стандарте в разделах Шаблоны (14), Создание и специализация шаблонов (14.7), Неявное создание (14.7.1).
3 Если специализация шаблона функции не была явно
конкретизированный или явно специализированный, шаблон функции
специализация неявно создается, когда специализация
ссылка в контексте, который требует определения функции для существования.
А также
11 Реализация не должна неявно создавать экземпляр функции
шаблон, шаблон элемента, не виртуальная функция-член, элемент
класс или статический член данных шаблона класса, который не
требуют инстанцирования.
Других решений пока нет …