0

我知道整数类型的非类型模板参数必须是 const 表达式,所以:

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

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

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

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

4

2 回答 2

3

无论你读什么都相当不完整。

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

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

于 2012-07-03T13:59:50.913 回答
2

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

 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; // ??
 }
于 2012-07-03T13:50:06.563 回答