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值而不能再次分配?
答案 0 :(得分: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
有关详细和详尽的解释,请参阅:
答案 1 :(得分:1)
确实看起来像个错误。
首先,全局const
对象必须在定义时初始化, default-initialization 不是枚举类型的选项。根据C ++ 11标准的第8.5 / 6段:
默认初始化T类型的对象意味着:
- 如果T是(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(并且 如果T没有可访问的默认构造函数,则初始化是错误的;)
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,不执行初始化。
如果程序要求对const限定类型T的对象进行默认初始化,则T应为具有用户提供的默认构造函数的类类型。
其次,初始化后无法分配const
个对象。
答案 2 :(得分:-2)
编辑以达成共识,认为这是编译器错误。
这是有效的,因为编译器错误地认为p的类型为Alpha
而不是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的赋值,所有内容都编译并按预期工作。