2

考虑以下模板类

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++ 标准中的相关段落在哪里。

4

1 回答 1

4

它在标准中指定,在模板 (14)、模板实例化和专业化 (14.7)、隐式实例化 (14.7.1) 下。

3 除非函数模板特化已被显式实例化或显式特化,否则当在需要函数定义存在的上下文中引用特化时,函数模板特化将被隐式实例化。

11 实现不应隐式实例化不需要实例化的类模板的函数模板、成员模板、非虚拟成员函数、成员类或静态数据成员。

于 2016-07-22T09:05:02.157 回答