MSVC const enum类型

时间:2013-02-17 16:40:24

标签: c++

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值而不能再次分配?

3 个答案:

答案 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的赋值,所有内容都编译并按预期工作。