考虑一个模板函数(带有原始模板变量,即非类,非结构模板变量):
#include <iostream>
template <int m, int n>
int f() {
return m+n;
}
int main() {
for (int i=0; i<2; ++i)
for (int j=0; j<2; ++j)
std::cout << f<i,j>() << endl;
}
编译器是否会生成f()
的4个副本?或只需1份,m,n为&#34;内部&#34;参数Δ
更新
看来这段代码无法编译。似乎模板变量必须是常量。 (我不确定:任何人?) 如果是这样,抱歉提出一个荒谬的问题。
答案 0 :(得分:2)
如果你的编译器足够聪明,可以推断出循环是constexpr
,那么它很可能会展开你的循环并内联函数体。
但是,当您使用gcc尝试此操作时,会出现几个错误,例如
test.cc:230:21: error: the value of 'i' is not usable in a constant expression
std::cout << f < i, j > () << endl;
非constexpr模板参数是一个问题,因为模板需要在编译时解析,但编译器将如何解析
std::cin >> a;
f< a, 2 >();
编译器无法做出这个编译时决定并抱怨。
除了这些明显的问题之外,我认为你的问题是编译器是否会为具有不同参数的模板实例化发出几个代码副本。一般来说,答案是是。但是,现代编译器有聪明的方法
来自Honza Hubička的gcc开发人员的博客提供了gcc5功能的精彩摘要。