9

C++11 形式化了窄化转换的概念,并且不允许在列表初始化的顶层使用一个。

我想知道,给定两种类型TU,是否有可能实现定义从Tto的转换是否U正在缩小。根据我对标准的阅读,情况就是这样。这是我的推理:

  • 根据dcl.init.list (8.5.4) 第 7 段,转换可以缩小的一种方法是,如果它是“从整数类型或无范围枚举类型到不能表示原始值的所有值的整数类型的隐式转换”类型”。
  • unsigned int考虑从到的隐式转换long
  • 关于 和 的相对大小intlongC++ 只需要sizeof(int) <= sizeof(long).
  • 考虑一个实现 A,其中sizeof(int) == sizeof(long). 在这个实现中,long不能代表 的所有值unsigned int,因此转换会变窄。
  • 考虑一个实现 B,其中sizeof(int) < sizeof(long). 在此实现中,long可以表示 的所有值unsigned int,因此转换不会缩小。

我的分析是否正确,可以由实现定义转换是否正在缩小?这是可取的吗?

4

1 回答 1

5

我确实更喜欢在类型本身上定义“缩小转换”。在某种程度上,int i{long(non_constant_expression)}永远不允许编译。原因很简单:要么你不需要长范围,那么你应该int首先使用,或者你真的想要“cut”,这对于我来说似乎是一个非常罕见的情况,需要显式类型转换或投掷。回答第一个问题:它是实现定义的。

但老实说,我几乎从不使用这种原始类型,只是size_t,int32_tuint16_t,这会自动解决问题。(uint16_t {uint8_t()}总是缩小,uint16_t{uint16_t()}从不。)一个人只需要深思熟虑地转换size_t成别的东西,但情况总是如此。

于 2012-11-19T11:49:26.940 回答