为什么这个const参数不能匹配非类型模板参数?

时间:2012-08-16 03:50:52

标签: c++ gcc const constant-expression

使用gcc编译下面的代码时,我收到一个错误:'i'不能出现在常量表达式中。

为什么会这样?

#include <iostream>

using namespace std;
template<int p>
class C
{
public:
    void test();
};

template<int p>
void C<p>::test()
{
    p = 0;
}

char const *const p = "hello";
int main()
{
    const int i = (int)p;
    C<i> c;
}

1 个答案:

答案 0 :(得分:2)

变量i在运行时不可变,因为它是const,但它不是“常量表达式”,因为它在编译时不会被计算。

(int)p;reinterpret_cast。积分常量表达式不能有reinterpret_cast。明确禁止(§5.19/ 2):

  

条件表达式核心常量表达式,除非它   涉及以下之一作为潜在评估的子表达式   (§3.2),但逻辑AND(§5.14),逻辑OR(§5.15)的子表达式,   和未评估的条件(§5.16)操作不是   考虑[注意:重载运算符调用函数.- 结束   注意]:

     

- [...]

     

- reinterpret_cast(§5.2.10);

     

- [...]