簡體   English   中英

實施定義的縮小轉換?

[英]Implementation-defined narrowing conversions?

C ++ 11形式化了縮小轉換的概念,並禁止在列表初始化中使用頂級轉換

我想知道,給定兩種類型TU ,它是否可能是實現定義的,從TU的轉換是否正在縮小。 根據我對標准的解讀,情況就是如此。 這是我的推理:

  • 根據dcl.init.list (8.5.4)第7段,轉換可以縮小的一種方式是,如果它是一個隱式轉換,“從整數類型或無范圍枚舉類型到整數類型,不能代表原始值的所有值類型”。
  • 考慮從unsigned intlong的隱式轉換。
  • 關於intlong的相對大小,C ++只需要sizeof(int) <= sizeof(long)
  • 考慮一個實現A,其中sizeof(int) == sizeof(long) 在這個實現中, long不能表示unsigned int所有值,因此轉換將變窄。
  • 考慮一個實現B,其中sizeof(int) < sizeof(long) 在此實現中, long可以表示unsigned int所有值,因此轉換不會縮小。

我的分析是否正確,可以通過實現來定義轉換是否正在縮小? 這是可取的嗎?

我確實更喜歡在類型本身上定義“縮小轉換”。 在某種程度上,永遠不允許int i{long(non_constant_expression)}進行編譯。 原因很簡單:要么你不需要長距離,那么你應該首先使用int ,或者你真的想要“剪切”,這似乎是一個非常罕見的情況,我需要一個明確的類型轉換或演員。 回答第一個問題:它是實現定義的。

但說實話,我幾乎從不使用這種原始類型,只需要size_tint32_tuint16_t等,這樣就可以自動解決問題。 uint16_t {uint8_t()}總是縮小, uint16_t{uint16_t()}永遠不會。)只需要將size_t轉換為其他東西,但情況總是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM