2013-02-17 153 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