C++11 形式化了窄化转换的概念,并且不允许在列表初始化的顶层使用一个。
我想知道,给定两种类型T
和U
,是否有可能实现定义从T
to的转换是否U
正在缩小。根据我对标准的阅读,情况就是这样。这是我的推理:
- 根据dcl.init.list (8.5.4) 第 7 段,转换可以缩小的一种方法是,如果它是“从整数类型或无范围枚举类型到不能表示原始值的所有值的整数类型的隐式转换”类型”。
unsigned int
考虑从到的隐式转换long
。- 关于 和 的相对大小
int
,long
C++ 只需要sizeof(int) <= sizeof(long)
. - 考虑一个实现 A,其中
sizeof(int) == sizeof(long)
. 在这个实现中,long
不能代表 的所有值unsigned int
,因此转换会变窄。 - 考虑一个实现 B,其中
sizeof(int) < sizeof(long)
. 在此实现中,long
可以表示 的所有值unsigned int
,因此转换不会缩小。
我的分析是否正确,可以由实现定义转换是否正在缩小?这是可取的吗?