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

我虽然静态地址是一个常量表达式,如下例所示,但我得到一个编译器错误(或者这是C ++ 0x的新增内容?)
class X {
    static const int x;
    enum { y = &x };
};
    
已邀请:
阅读1998年标准,5.19(1):“在几个地方,C ++需要表达式来评估整数或枚举常量......作为枚举器初始化器(7.2)....” 此外,“一个整数常量表达式只能涉及......特别是,除了
sizeof
表达式外,不应使用函数,类对象,指针或引用......” 浮动文字显式列为可转换为整数或枚举类型,没有别的。 甚至转换地址常量表达式使枚举器初始值设定项在第一个标准中无效。     
变量的地址(静态或非静态)不是编译时常量。
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!
};
不要将编译时常量与运行时常量混淆。他们是两件不同的事。     
它是一个常量表达式,但在编译时无法确定。地址的实际值将取决于可执行程序最终被任何操作系统正在运行的东西加载到的内存区域。枚举成员需要具有可由编译器确定的值。 干杯, J.     
静态对象的地址是一个常量表达式,但是 它不是一个完整的常量表达式,因为它不是 有一个整体类型。并且
reinterpret_cast
到它 积分型仍然不能使它成为一个整数常数 表达式,因为积分中不允许
reinterpret_cast
常数表达式。并且初始化器为
enum
值 需要一个整数常量表达式。 当然,这就是你获得编译器的原因 错误是您尝试初始化
enum
值 一个没有整数类型的表达式,但没有 有一个隐式转换为整数类型。     
该计划格式不正确,因为: 对象的地址不是 积分常数表达式 取x的地址需要一个(n 课外)定义 使用静态const积分成员除了积分之外的任何地方 constant-expression是必需的,需要一个定义。     

要回复问题请先登录注册