2

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

实例化时,只能传递编译时常量整数。这意味着100,100+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) 不是?

4

2 回答 2

4

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

编辑:我的意思是说,即使is absnot constexpr,您也可以简单地编写自己的absis constexpr。可以发誓我在里面编辑过。

于 2012-07-01T15:25:16.957 回答
3

100+99199在编译时进行了优化。

abs()是函数,它可能会或可能不会被标记constexpr(C++11 功能,这将允许您这样做;您可以轻松检查 cppreference 或标准以查看它是否constexpr在 C++11 中)。需要执行;编译器无法推断它是无状态函数,每次使用相同参数运行时返回相同值。

于 2012-07-01T15:25:08.843 回答