【发布时间】:2014-02-10 02:22:45
【问题描述】:
此表达式可在标准 (N3797) §8.5.4/7 中的示例中找到
unsigned int ui1 = {-1}; // error: narrows
鉴于 §8.5.4/7 及其第 4 个要点:
窄化转换是一种隐式转换:
- 从整数类型或无作用域枚举类型到不能表示原始类型所有值的整数类型, 除非源是一个常量表达式,其值在 积分促销将适合目标类型。
我想说这里没有缩小范围,因为 -1 是一个常量表达式,其值在积分提升后适合无符号整数。
另请参阅 §4.5/1 关于整体推广:
除 bool、char16_t、char32_t 或 wchar_t 其整数转换等级 (4.13) 小于 如果 int 可以表示所有,则 int 可以转换为 int 类型的纯右值 源类型的值;否则,源纯右值可以是 转换为 unsigned int 类型的纯右值。
从 4.13 开始,我们得到 -1(一个 int)的秩等于一个 unsigned int 的秩,因此它可以转换为一个 unsigned int。
编辑
不幸的是,Jerry Coffin 从这个帖子中删除了他的答案。我相信他走在正确的轨道上,如果我们接受在标准中的 change 之后的第 8.5.4/7 节中第 4 个要点的当前阅读是错误的事实。
【问题讨论】:
-
没有。它已经是一个整数(有符号整数),转换后它的值不适合目标类型。
unisgned integer不能代表signed integer的所有值,具体而言;它不能代表负值。 -
"-1 是一个常量表达式,它的整数提升后的值适合一个无符号整数。" - 不,-1 是
int类型,因此,它不会被提升为任何东西。 -
@ElliottFrisch 如果您将无符号整数视为正整数则不能,如果您将其视为模整数则可以!!
标签: c++ c++11 language-lawyer narrowing