为什么模板声明中的size_t参数需要是const?

Aru*_*run 1 c++ templates

我可以有

std::bitset< 10 > bitsetA;
Run Code Online (Sandbox Code Playgroud)

要么

const size_t LengthB = 20;
std::bitset< LengthB > bitsetB;
Run Code Online (Sandbox Code Playgroud)

没有任何问题.

但是,如果长度不是 const

size_t LengthC = 30;
std::bitset< LengthC > bitsetC;  // Line 30, say
Run Code Online (Sandbox Code Playgroud)

我面临以下编译错误

'LengthC' cannot appear in a constant-expression
template argument 1 is invalid
Run Code Online (Sandbox Code Playgroud)

这是什么原因?

对于编译器和用户代码,如果要接受第30行,会出现什么问题?是因为LengthC可能有一些别名吗?

GMa*_*ckG 6

模板根据模板参数实例化新类型,这在编译时完成.您无法在运行时实例化新类型,因为C++是静态类型的.

所以当你有一个非const变量时,它不能作为模板参数传递,因为它不能保证是那个值(你必须"在运行时"实例化一个新类型).只有当它是const时,才能确保该值确实是常量,因此可用于模板参数.