3

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

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

5 回答 5

5

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

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

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

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


但是,允许以下情况:

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

不要将编译时常量与运行时常量混淆。它们是两种不同的东西。

于 2011-04-06T14:31:57.053 回答
2

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

此外,“一个完整的常量表达式只能涉及......特别是,除了在sizeof表达式中,不得使用函数、类对象、指针或引用......”

浮动文字被明确列为可转换为整数或枚举类型,没有别的了。

从第一个标准开始,甚至强制转换地址常量表达式来生成枚举器初始化器也是无效的。

于 2011-04-06T14:49:43.690 回答
1

该程序格式错误,因为:

  • 对象的地址不是整数常量表达式
  • 取 x 的地址需要一个(n out of class) 定义
  • 在任何地方使用静态 const 整数成员,除了需要整数常量表达式的地方需要定义。
于 2011-04-06T14:33:52.790 回答
1

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

干杯,
J。

于 2011-04-06T14:35:50.403 回答
1

静态对象的地址是一个常量表达式,但它不是一个整型常量表达式,因为它没有整型。并且reinterpret_cast将其转换为整数类型仍然不会使其成为整数常量表达式,因为reinterpret_cast在整数常量表达式中是不允许的。值的初始化器enum需要一个整数常量表达式。

当然,就目前而言,您收到编译器错误的原因是您尝试enum使用没有整数类型且没有隐式转换为整数类型的表达式初始化值.

于 2011-04-06T14:38:46.017 回答