2010-04-24 154 views
1

我可以有为什么模板声明中的size_t参数需要为const?

std::bitset<10> bitsetA; 

const size_t LengthB = 20; 
std::bitset<LengthB> bitsetB; 

没有任何问题。

但是,如果长度不const

size_t LengthC = 30; 
std::bitset<LengthC> bitsetC; // Line 30, say 

我面临以下编译错误

'LengthC' cannot appear in a constant-expression 
template argument 1 is invalid 

是什么原因呢?

如果第30行被接受,那么编译器和用户代码会出现什么问题?是不是因为长度C可能有别名?

+0

另一种方法是Boosts'dynamic_bitset':http://www.boost.org/doc/libs/1_42_0/libs/dynamic_bitset/dynamic_bitset.html – 2010-04-24 16:58:29

回答

4

模板参数必须在编译时声明const,以便模板可以在编译时实例化。

在你给出的例子中,确实看起来LengthC不会从它初始化的地方变成模板必须被实例化的地方,所以它可以被视为常量,但是编译器没有义务弄清楚。规范说明必须声明参数const,以便不需要编译时流控制分析。

7

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

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

1

模板是编译时生物 - 变量是运行时生物。如果您需要将变量传递给模板,则需要在运行时执行该变量,例如在模板类的构造函数中。

1

C++编译器是严格当谈到const铸造。

10const size_t LengthB = 20;都评估为常数。没有const关键字,编译器无法轻易确定变量是否可能在声明和使用之间发生变化。

相关问题