我有一个函数void f<int N>()
。仅使用模板参数1和2调用f
,例如f<1>()
和f<2>()
我对这两个参数有效地专门f
。永远不会使用任何其他参数调用f
,但我已将[{1}}定义为通用f
,仅用于&#34;清晰度&#34;。问题:编译器是否仍会实例化N
这个未使用的定义?如果是这样,我觉得这会产生代码膨胀,因为我有很多这类函数位于非常高性能 - 该计划的关键领域。
(相反,我考虑评论f<N>()
定义并将其替换为空定义,即f<N>()
。)
答案 0 :(得分:1)
除非使用模板,否则不会实例化模板。
来自标准:
§14.7.1/ 10
实现不应隐式实例化函数 模板,成员模板,非虚拟成员函数,成员 class,或类模板的静态数据成员 需要实例化。没有具体说明是否 实现隐式实例化一个虚拟成员函数 如果虚拟成员函数不存在,则为类模板 实例化。在默认情况下使用模板特化 参数不应导致模板被隐式实例化 除了可以在完整的情况下实例化类模板 需要type来确定默认参数的正确性。 在函数调用中使用默认参数会导致 默认参数中的特化要隐式实例化。