5
const enum Alpha{
    X=9,
    Y=5,
    Z=2
}p;
int main(){
    enum Alpha a,b;
    a= X;
    b= Z;

    p = X;
    p = Y;

    printf("%d",a+b-p); 
    return 0; 
}

为什么在 MSVC 编译器中允许 p = X 和 p = Y?此代码输出 6。不应该在初始化时分配一个 const 值,并且永远不要再分配?

4

3 回答 3

6

这是编译器本身的一个错误。故事的结局。

实际上,您的小代码在编译器中显示了两个错误。第一个错误就在这里:

const enum Alpha{
    X=9,
    Y=5,
    Z=2
}p;    //declaration of p is ill-formed!

的声明p格式不正确,因此编译器应拒绝此代码,因为p已声明const但未初始化。一个const标量(和 pod)类型必须被初始化才能形成良好的格式:

const Alpha q;      //ill-formed (same case is with p in your code)
const Alpha r = X;  //well-formed

有关详细和广泛的解释,请参见:

于 2013-02-17T16:48:16.210 回答
1

看起来确实是个bug。

首先,全局const对象必须在定义时进行初始化,默认初始化不是枚举类型的选项。根据 C++11 标准的第 8.5/6 段:

默认初始化 T 类型的对象意味着:

— 如果 T 是(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);

— 如果 T 是数组类型,则每个元素都是默认初始化的;

— 否则,不执行初始化。

如果程序要求对 const 限定类型 T 的对象进行默认初始化,则 T 应是具有用户提供的默认构造函数的类类型

其次,const初始化后无法分配对象。

于 2013-02-17T16:48:44.463 回答
-2

编辑以匹配这是一个编译器错误的共识。

这是有效的,因为编译器错误地认为 p 是 typeAlpha而不是const Alpha。如果您将其重写为

enum Alpha{....
} const p;

编译器会正确地抱怨一个常量没有被初始化。

error C2734: 'p' : const object must be initialized if not extern
error C3892: 'p' : you cannot assign to a variable that is const

如果分配常数,

enum Alpha{....
} const p = Y;

并删除对 p 的分配,一切都按预期编译和工作。

于 2013-02-17T16:58:47.127 回答