HC4*_*ica 6 c++ implicit-conversion c++11 list-initialization
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
,因此转换不会缩小.我的分析是否正确,可以通过实现来定义转换是否正在缩小?这是可取的吗?
我确实更喜欢在类型本身上定义“缩小转换”。以某种方式int i{long(non_constant_expression)}
永远不允许编译。原因很简单:要么你不需要长范围,那么你应该int
首先使用,或者你真的想要“剪切”,这对我来说似乎是一种罕见的情况,需要显式类型转换或投掷。回答第一个问题:它是实现定义的。
但说实话,我几乎从来没有,只是用这种原始类型size_t
,int32_t
,uint16_t
等,这样就解决了问题自动。(uint16_t {uint8_t()}
总是缩小,uint16_t{uint16_t()}
从不。)人们只需要深思熟虑地转换size_t
成其他东西,但情况总是如此。