以下代碼在C++ 11中是否合法?在C++ 11中縮小轉換次數:轉換後的實際值是多少?
int16_t x {0xaabb};
int64_t xxxx {0xaaaabbbbccccdddd};
該代碼來自「The C++ Programming Language」第4版(第150頁)。
正如我們所知,收縮轉換是不允許的列表初始化,以及縮小轉換標準的定義中,我們有:
收縮轉換是隱式轉換
- [...]
- 從整數類型或非範圍枚舉類型轉換爲無法表示原始類型的所有值的整數類型,除非源代碼是常量表達式並且轉換後的實際值將適合目標類型並將生成轉換回原始類型時的原始值。
檢查縮小轉換針對示例代碼的規則中,我認爲該示例代碼是非法的,因爲0xaabb
和0xaaaabbbbccccdddd
不能在int16_t
和int64_t
分別表示。那是對的嗎?
但我不太明白措辭「除了源是一個常量表達式和轉換後的實際值將適合目標類型,並將轉換回原始類型時產生原始值」 。我想知道轉換後的實際值不能在中適合目標類型。由於整數類型之間的轉換總是有效的(儘管在目標類型已簽名且源值不能在目標類型中表示的情況下是實現定義的,但它不是未定義的行爲),總是這樣的:「值轉換後是否符合目標類型「?從這個角度來看,我開始質疑我對示例代碼縮小轉換的判斷。如果是這樣的話,爲什麼標準在某種情況下總是把事情做成真實的?爲什麼不只是說「除了源是一個常量表達式,轉換後的實際值在轉換回原始類型時會產生原始值」?
有人可以幫我澄清一下嗎?謝謝!
我認爲這個問題來自於'0xaabb'可以被認爲是一個「正數」常量,但是當它被分配給一個'int16_t'時,它就變成了一個負數。嗯,我剛剛回復了一個不再在這裏的評論,但我會留下這個,因爲它可能會澄清問題。 – icabod
您是否可以改進標題,以便在問題列表中將此問題與其他人區分開來? –
經驗上說,它應該是合法的,因爲GCC會發出警告(所以編譯器明確知道這個問題),但它不會發出錯誤。如果它確實是非法的,那麼編譯應該會發生錯誤(而不是警告)。 – Damon