此表达式可在标准 (N3797) §8.5.4/7 中的示例中找到
unsigned int ui1 = {-1}; // error: narrows
鉴于§8.5.4/7 及其第 4 个要点:
缩小转换是一种隐式转换:
- 从整数类型或无作用域枚举类型到不能表示原始类型的所有值的整数类型,除非源是常量表达式,其值在整数提升后将适合目标类型。
我想说这里没有缩小范围,因为 -1 是一个常量表达式,它在积分提升后的值适合一个无符号整数。
另请参阅关于Integral Promotion的 §4.5/1 :
如果 int 可以表示源类型的所有值,则可以将除 bool、char16_t、char32_t 或 wchar_t 的整数转换等级 (4.13) 小于 int 等级的整数类型的纯右值转换为 int 类型的纯右值; 否则,可以将源纯右值转换为 unsigned int 类型的纯右值。
从 4.13 开始,我们得到 -1(一个 int)的秩等于一个 unsigned int 的秩,因此它可以转换为一个 unsigned int。
编辑
不幸的是, Jerry Coffin从这个帖子中删除了他的答案。我相信他走在正确的轨道上,如果我们接受这样一个事实,即在标准发生这种变化之后,目前对第 8.5.4/7 节第 4 条要点的解读是错误的。