我知道枚舉類型實現取決於枚舉器的值,編譯器選擇一個可以表示所有枚舉器值的類型,在下面的例子中我不知道爲什麼example1沒有編譯,而example2編譯好嗎?
在C++中實現枚舉器
注:
這個大數字不只是一個隨機數,這也正是pow(2,63)
,我不能沒有使用它,因爲普查員只能與整型常量表達式進行初始化。
9223372036854775808 = pow(2,63)
example1.1:
enum A{a=9223372036854775808,b=-1};
cout << sizeof(a) << endl;
錯誤:沒有積分類型可以表示爲 '主():: A' 所有的枚舉值的
example1.2:
enum A{a=9223372036854775808,b=-9223372036854775807};
cout << sizeof(a) << endl;
b=-(pow(2,63) - 1)
這也給了我同樣的錯誤,沒有整型都可以代表A中的所有枚舉值
例2:
enum A{a=9223372036854775808,b=-9223372036854775808};
cout << sizeof(a) << endl; // prints 8
這個編譯沒有任何e (a)的大小爲8。
對上述行爲有解釋嗎?
更新:
如果使用Coliru編譯上面的代碼,它編譯沒有錯誤,因爲它有一個完整的類型,它是16個字節長,所以改變a
價值pow(2,127)-1
和b
到-1
會再次出現相同的錯誤。爲了避免混淆,讓我們堅持使用32位機器爲了這個例子,在線編譯器使用Ideone。
我的問題很清楚,爲什麼它的工作原理是b=-9223372036854775808
,而不是如果b=-1
?
UPDATE2:
注意例題(c++11 comipler)不編譯使用C++ 11,這在我看來是做了順理成章的事情。但在C++ 03 example2(c++03 compiler)編譯得很好,但example1不能編譯。
在example2中'b'截斷,還是真的是'-9223372036854775808'? – woolstar
@woolstar我找不到有關「b」值是否被截斷的任何信息。我更新了我的問題,我用C++ 11測試了這個問題,它不編譯'example1'和'example2',我認爲這是正確的行爲。 在c + + 03'example2'編譯好,我不知道爲什麼。 – AlexDan