考虑以下模板类
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++ 标准中的相关段落在哪里。