0

使用 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;
}
4

1 回答 1

2

该变量i在运行时不可变,因为它是const,但它不是“常量表达式”,因为它不在编译时进行评估。

(int)p;是一个reinterpret_cast。整型常量表达式不能有reinterpret_cast. 明确禁止(§5.19/2):

条件表达式核心常量表达式,除非它涉及以下之一作为潜在评估的子表达式(第 3.2 节),但逻辑与(第 5.14 节)、逻辑或(第 5.15 节)和条件(第 5.16 节)操作的子表达式未评估的不被考虑 [注意:重载的运算符调用函数。-<em>结束注释]:

— [...]

— a reinterpret_cast(第 5.2.10 节);

— [...]

于 2012-08-16T03:56:06.117 回答