2013-02-17 152 views
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.不应该在初始化时分配常量值,也不要再次分配常量值?MSVC常量枚举类型

+0

会分配一个p作品吗? – Arpit 2013-02-17 16:44:43

+0

是的,在这种情况下输出为2 – 2013-02-17 16:46:57

+0

请指出您的确切编译器版本。 – 2013-02-17 16:52:05

回答

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 

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

+0

哦!这就是为什么它不能在我的DevC中工作。 – Arpit 2013-02-17 16:51:14

+0

该死的,我发现了一个bug :(谢谢 – 2013-02-17 16:51:20

+0

是'alpha'非POD?真的吗? – 2013-02-17 16:52:31

1

貌似确实是一个错误。

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

为默认初始化类型T的对象是指:

- 如果T是一个(可能是CV-合格)类型(第9),调用T的默认构造函数(如果T没有可访问的默认构造函数,则 初始化不合格);

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

- 否则,不执行初始化。

如果程序要求一个常量限定类型T的对象的默认的初始化,T应为一个类类型与用户提供的默认的构造

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

-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,一切编译和按预期工作。

+0

*“这是可行的,因为p是'Alpha'而不是'const alpha'“*。这是错误的,'p'的类型是'const Alpha',因为'const'应用于变量,而不是枚举定义。'const Alpha p'和'Alpha const p'是完全一样的东西! – Nawaz 2013-02-17 17:00:14