[英]Implementation-defined narrowing conversions?
C ++ 11形式化了縮小轉換的概念,並禁止在列表初始化中使用頂級轉換 。
我想知道,給定兩種類型T
和U
,它是否可能是實現定義的,從T
到U
的轉換是否正在縮小。 根據我對標准的解讀,情況就是如此。 這是我的推理:
unsigned int
到long
的隱式轉換。 int
和long
的相對大小,C ++只需要sizeof(int) <= sizeof(long)
。 sizeof(int) == sizeof(long)
。 在這個實現中, long
不能表示unsigned int
所有值,因此轉換將變窄。 sizeof(int) < sizeof(long)
。 在此實現中, long
可以表示unsigned int
所有值,因此轉換不會縮小。 我的分析是否正確,可以通過實現來定義轉換是否正在縮小? 這是可取的嗎?
我確實更喜歡在類型本身上定義“縮小轉換”。 在某種程度上,永遠不允許int i{long(non_constant_expression)}
進行編譯。 原因很簡單:要么你不需要長距離,那么你應該首先使用int
,或者你真的想要“剪切”,這似乎是一個非常罕見的情況,我需要一個明確的類型轉換或演員。 回答第一個問題:它是實現定義的。
但說實話,我幾乎從不使用這種原始類型,只需要size_t
, int32_t
, uint16_t
等,這樣就可以自動解決問題。 ( uint16_t {uint8_t()}
總是縮小, uint16_t{uint16_t()}
永遠不會。)只需要將size_t
轉換為其他東西,但情況總是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.