实施定义的缩小转换?

时间:2012-11-19 10:14:11

标签: c++ c++11 implicit-conversion list-initialization

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的所有值,因此转化不会缩小。

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

1 个答案:

答案 0 :(得分:4)

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

但说实话,我几乎从不使用这种原始类型,只有size_tint32_tuint16_t等,这样可以自动解决问题。 (uint16_t {uint8_t()}总是缩小,uint16_t{uint16_t()}永远不会缩小。)只需要将size_t转换为其他内容,但情况总是如此。