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 值,并且永远不要再分配?
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 值,并且永远不要再分配?
这是编译器本身的一个错误。故事的结局。
实际上,您的小代码在编译器中显示了两个错误。第一个错误就在这里:
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
有关详细和广泛的解释,请参见:
看起来确实是个bug。
首先,全局const
对象必须在定义时进行初始化,默认初始化不是枚举类型的选项。根据 C++11 标准的第 8.5/6 段:
默认初始化 T 类型的对象意味着:
— 如果 T 是(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);
— 如果 T 是数组类型,则每个元素都是默认初始化的;
— 否则,不执行初始化。
如果程序要求对 const 限定类型 T 的对象进行默认初始化,则 T 应是具有用户提供的默认构造函数的类类型。
其次,const
初始化后无法分配对象。
编辑以匹配这是一个编译器错误的共识。
这是有效的,因为编译器错误地认为 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 的分配,一切都按预期编译和工作。