我在读一篇关于非类型模板参数的文章,它说:
当被实例化时,只能传递编译时常量整数。这意味着100
,100+99
,1<<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)不是?
我高度怀疑整数字面量是否被视为一个对象。如果是的话,我很好奇C是如何做到这一点的,在那里没有运算符重载的概念。 – Mahesh
如果C++是纯粹的面向对象语言,是的。但事实并非如此。继续尝试'100.operator +(99)',看看会发生什么。 –
选择什么表达式可以在编译时进行有意义的评估在某些时候必定是任意的。 C++选择对此保守,所以它大多是微不足道的表达式,模板或其他所知道的“安全”。例如。编译器如何知道在编译时评估'printf(“”)'是否合理? – millimoose