实施定义的缩小转换?

HC4*_*ica 6 c++ implicit-conversion c++11 list-initialization

C++ 11形式化了缩小转换的概念,并禁止在列表初始化中使用顶级转换.

我想知道是否给定两个类型TU,有可能它是实现定义的转换是否TU正在缩小.根据我对标准的解读,情况就是如此.这是我的推理:

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

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

coo*_*451 5

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

但说实话,我几乎从来没有,只是用这种原始类型size_tint32_tuint16_t等,这样就解决了问题自动。(uint16_t {uint8_t()}总是缩小,uint16_t{uint16_t()}从不。)人们只需要深思熟虑地转换size_t成其他东西,但情况总是如此。