非类型模板参数

时间:2012-07-03 13:47:05

标签: c++ templates

我知道intgral类型的非类型模板参数必须是const表达式,因此:

template <int E>
class cat
{
public:
    int array[E];
};

int main()
{
    cat<4> ob; // ??
}

根据我的阅读,仅const使用const表达式初始化的const个变量是int E = 4;个表达式。在此示例中,我们有E,因此const cat<4> ob;表达式。

那么为什么int array[E];不会抛出错误?我在这里遗漏了什么吗? 如果在编译时不知道E,将如何创建{{1}}?

2 个答案:

答案 0 :(得分:3)

无论你读什么都不完整。

常量表达式还包括文字(如4),枚举数,sizeof表达式,带有常量参数的constexpr函数的结果(自2011年起),以及{{1}变量。任何具有整数类型的都可以用作整数模板参数。

可能还有其他一些我没有想过的,并且从常量表达式构建的任何复杂表达式也是一个常量表达式。

答案 1 :(得分:2)

在实际编译开始之前,

E4。模板专门化在此之前发生,这意味着编译器实际看到的代码类似于

 class cat4
 {
 public:
 int array[4];
 };

 int main()
 {
 cat4 ob;
 }

这是一个相当松散的解释,不要把它当作ad-litteram。

要真正测试此方案,您可以尝试:

 template <int E>
 class cat
 {
 public:
 int array[E];
 };

 int main()
 {
 int k = 4;
 cat<k > ob; // ??
 }