非类型模板参数

Non-type template Arguments

本文关键字:参数 类型      更新时间:2023-10-16

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

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

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

编辑:我的意思是说,即使abs没有constexpr,你也可以简单地写出你自己的abs这是constexpr。可以发誓我编辑了它。

100+99被优化为在编译时199

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