MSVC常量枚举类型

MSVC const enum type

本文关键字:类型 枚举 常量 MSVC      更新时间:2023-10-16
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 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是数组类型,则默认初始化每个元素;

--否则,不执行初始化。

如果程序调用常量限定类型T的对象的默认初始化,则T应为具有用户提供的默认构造函数的类类型

其次,初始化后不能分配const对象。

经过编辑以匹配一致认为这是一个编译器错误。

这是因为编译器错误地认为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的赋值,一切都按预期编译和工作。