为什么下面的表达式表示缩小转换?

Wak*_*zil 8 c++ language-lawyer narrowing c++11

该表达式可在标准中的§8.5.4/ 7中的示例中找到(N3797)

unsigned int ui1 = {-1}; // error: narrows
Run Code Online (Sandbox Code Playgroud)

鉴于§8.5.4/ 7及其第4个要点:

缩小转换是隐式转换:

  • 从整数类型或未范围的枚举类型到不能表示原始类型的所有值的整数类型,除非源是一个常量表达式,其整数提升后的值将适合目标类型.

我想说这里没有缩小,因为-1是一个常量表达式,其积分提升后的值适合无符号整数.

另见关于积分促销的 §4.5/ 1 :

如果int可以表示源类型的所有值,则除了bool,char16_t,char32_t或wchar_t之外的整数类型的prvalue(其整数转换等级(4.13)小于int的等级)可以转换为int类型的prvalue ; 否则,源prvalue可以转换为unsigned int类型的prvalue.

从4.13开始,我们得到-1(一个int)的等级等于unsigned int的等级,因此它可以转换为unsigned int.

编辑

不幸的是,Jerry Coffin从这个帖子中删除了他的答案.我相信他是在正确的轨道上,如果我们接受这一事实,即在标准的这一变化之后,§8.5.4/ 7中第4个要点的当前读数是错误的.

Joh*_*itb 7

没有积分的推广,从intunsigned int,为此它仍然是格式不正确.

这将是一个完整的转换.


dav*_*pfx 1

标准措辞的变化旨在确认将负值转换为无符号类型始终是一种缩小转换的理解。

通俗地说,-1 不能在任何无符号类型的范围内表示,并且如果存储在无符号 int 中,表示它的位模式并不表示相同的值。因此,这是缩小转换,不涉及提升/扩大。

这是关于阅读标准的精致艺术。像往常一样,编译器最了解。