非类型模板参数

non-type template argument

本文关键字:参数 类型      更新时间:2023-10-16

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

template <int E>
class cat
{
public:
    int array[E];
};
int main()
{
    cat<4> ob; // ??
}

从我只读到的内容来看,constconst表达式初始化的变量const表达式。在这个例子中,我们有 int E = 4; ,所以E不会是一个const表达式。

那么为什么cat<4> ob;不抛出错误呢?我在这里错过了什么吗?
如果在编译时不知道E,将如何创建int array[E];

无论你读到什么,都是相当不完整的。

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

可能还有其他一些我没有想到的,任何由常量表达式构建的复杂表达式也是常量表达式。

E

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

 class cat4
 {
 public:
 int array[4];
 };
 int main()
 {
 cat4 ob;
 }

这是一个相当松散的解释,不要把它当作垃圾。

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

 template <int E>
 class cat
 {
 public:
 int array[E];
 };
 int main()
 {
 int k = 4;
 cat<k > ob; // ??
 }