我知道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}}?
答案 0 :(得分:3)
无论你读什么都不完整。
常量表达式还包括文字(如4
),枚举数,sizeof
表达式,带有常量参数的constexpr
函数的结果(自2011年起),以及{{1}变量。任何具有整数类型的都可以用作整数模板参数。
可能还有其他一些我没有想过的,并且从常量表达式构建的任何复杂表达式也是一个常量表达式。
答案 1 :(得分:2)
E
为4
。模板专门化在此之前发生,这意味着编译器实际看到的代码类似于
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; // ??
}