使用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;
}
答案 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);- [...]