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
的所有值,因此转化不会缩小。我的分析是否正确,可以通过实现来定义转换是否正在缩小?这是可取的吗?
答案 0 :(得分:4)
我确实更喜欢在类型本身上定义“缩小转换”。在某种程度上,永远不允许int i{long(non_constant_expression)}
编译。原因很简单:要么你不需要长距离,那么你应该首先使用int
,或者你真的想要“剪切”,这似乎是一个非常罕见的情况,我需要一个显式类型转换或强制转换。回答第一个问题:它是实现定义的。
但说实话,我几乎从不使用这种原始类型,只有size_t
,int32_t
,uint16_t
等,这样可以自动解决问题。 (uint16_t {uint8_t()}
总是缩小,uint16_t{uint16_t()}
永远不会缩小。)只需要将size_t
转换为其他内容,但情况总是如此。