2012-07-03 198 views
0

我知道,intgral型非类型模板参数必须是常量表达式,以便:
非类型模板参数

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;抛出一个错误?我在这里错过了什么吗?
如果在编译时不知道E,将如何创建int array[E];

+7

'4'是编译时间常数。 – hmjd

+0

@hmjd我在谈论E.当我做猫<4> ob;它就像告诉编译器创建变量E并将其设置为4一样,因为E是非const int。所以在编译时E不会知道E的值。所以数组[E]会抛出一个错误。 – AlexDan

回答

2

E4实际编译开始之前。模板专业化发生在此之前,这意味着由编译器实际看到的代码是一样的东西

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

int main() 
{ 
cat4 ob; 
} 

这是一个相当松散的解释,不要把它广告litteram。

要真正检验这个场景了,你可以试试:

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

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

我在谈论E.当我做猫<4> ob;它就像告诉编译器创建变量E并将其设置为4一样,因为E是非const int。所以E的值在编译时不会被知道 – AlexDan

+0

@AlexDan你正在考虑错误的模板。 E不是一个变量,它是一个模板参数。 IMO模板比实际的类更接近宏。 –

+0

@AlexDan将“E”称为变量并不准确,事实上对于所有实际情况,它都不会变化。 –

3

不管你看是相当不完整的。

常量表达式也包括文字(如4),统计员,sizeof表达式的使用常量参数constexpr功能(自2011年)的结果,以及const变量。所有这些整数类型都可以用作整型模板参数。

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