Метод в классе шаблона только для определенных параметров шаблона правильный

Рассмотрим следующий шаблонный класс

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 ++.

2

Решение

Это определено в стандарте в разделах Шаблоны (14), Создание и специализация шаблонов (14.7), Неявное создание (14.7.1).

3 Если специализация шаблона функции не была явно
конкретизированный или явно специализированный, шаблон функции
специализация неявно создается, когда специализация
ссылка в контексте, который требует определения функции для существования.

А также

11 Реализация не должна неявно создавать экземпляр функции
шаблон, шаблон элемента, не виртуальная функция-член, элемент
класс или статический член данных шаблона класса, который не
требуют инстанцирования.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]