静态const的地址不是const表达式?

时间:2011-04-06 14:26:58

标签: c++ static constant-expression

我虽然静态地址是一个常量表达式,如下例所示,但我得到一个编译器错误(或者这是C ++ 0x的新内容?)

class X {
    static const int x;
    enum { y = &x };
};

5 个答案:

答案 0 :(得分:5)

变量的地址(无论是静态还是非静态)不是编译时常量。 enum需要编译时常量。这就是为什么会出错。

事实上,GCC给出了非常明确的错误信息:

  

prog.cpp:7:错误:'X :: x'不能出现在常量表达式中   prog.cpp:7:错误:`&'不能出现在常量表达式

自己看看:http://ideone.com/FJk3C


但是,以下是allowed

class X {
    static const int x;
    enum { y = sizeof(x) }; //okay. sizeof(x) can be known at compile time!
};

不要将编译时常量与运行时常量混淆。他们是两件不同的事情。

答案 1 :(得分:2)

阅读1998年标准,5.19(1):“在几个地方,C ++需要表达式来评估整数或枚举常量......作为枚举器初始化器(7.2)....”

此外,“一个整数常量表达式只能涉及......特别是,除sizeof表达式外,不应使用函数,类对象,指针或引用....” p>

浮动文字显式列为可转换为整数或枚举类型,没有别的。

使用地址常量表达式进行转换以使枚举数初始值设定项在第一个标准中无效。

答案 2 :(得分:1)

该计划格式不正确,因为:

  • 对象的地址不是 积分常数表达式
  • 取x的地址需要a(n 课外)定义
  • 使用静态const积分成员除了积分之外的任何地方 constant-expression是必需的,需要定义。

答案 3 :(得分:1)

这是一个常量表达式,但在编译时无法确定。地址的实际值将取决于可执行程序最终被任何操作系统正在运行的东西加载到的内存区域。枚举成员需要具有可由编译器确定的值。

干杯,
学家

答案 4 :(得分:1)

静态对象的地址是常量表达式,但是 它不是一个完整的常量表达式,因为它不是 有一个整体类型。并reinterpret_cast将其发送给 积分型仍然不能使它成为一个整数常数 表达式,因为积分中不允许reinterpret_cast 常数表达式。以及enum值的初始值设定项 需要一个整数常量表达式。

当然,这就是你获得编译器的原因 错误是您尝试初始化enum值 一个没有整数类型的表达式,但没有 隐式转换为整数类型。