非类型模板参数

时间:2012-07-01 15:20:46

标签: c++ templates

我正在阅读一篇关于非类型模板参数的文章,它说:

实例化时,只能传递编译时常数。这意味着允许100100+991<<3等,因为它们是编译的时间常量表达式。不允许涉及函数调用的参数,如abs(-120)

示例:

template<class T, int SIZE>
class Array{};

int main(){
Array<int, 100+99> my_array; // allowed
Array<int, abs(-120)> my_array; // not allowed
}

100 + 99和abs(-120)之间有什么区别?
怎么来100 + 99是编译时间而abs(-120)不是?

2 个答案:

答案 0 :(得分:4)

无,abs(-120)在C ++ 11中完全合法。正如你充分指出的那样,C ++ 03没有可以在编译时评估的函数的范围,但是C ++ 11可以。对于abs,您可以将其替换为执行相同计算的模板,并在C ++ 03中使用abs_template<-120>::value

编辑:我的意思是,即使abs不是constexpr,您也可以轻松编写自己的abs constexpr。我发誓可以发誓。

答案 1 :(得分:3)

100+99在编译时优化到199

abs()是函数,它可能会也可能不会被标记为constexpr(C ++ 11功能,允许您这样做;您可以轻松检查cppreference或standard以查看它是否{{ {1}}在C ++中11)。它需要执行;编译器不能推断它的状态较少的函数为每个具有相同参数的运行返回相同的值。