这个表达式可以在标准(N3797)的§8.5.4/7中的示例中找到。
unsigned int ui1 = {-1}; // error: narrows
鉴于第8.5.4/7节及其第四个要点:
缩窄转换是隐式转换:
我想说这里没有缩小,因为-1是一个常量表达式,积分提升后的值符合一个无符号整数。
另见关于积分促进的第4.5/1节。
整数转换秩(4.13)小于int的整数类型( bool、char16_t、char32_t或wchar_t )以外的整数类型的prvalue可以转换为int类型的prvalue,如果int可以表示源类型的所有值;否则,源prvalue可以转换为类型为无符号int的prvalue。
从4.13我们得到-1 (一个int)的秩等于一个无符号int的秩,因此它可以转换为一个无符号int。
编辑
不幸的是,曾傑瑞咖啡从这个线程中删除了他的答案。我相信他是在正确的轨道上,如果我们接受的事实,目前的第4点在第8.5.4/7节是错误的,在这个变化在标准。
发布于 2014-01-21 14:03:42
对标准措辞的更改旨在确认这样一种理解,即将负值转换为无符号类型是而且一直是缩小转换。
非正式地说,-1不能在任何无符号类型的范围内表示,而表示它的位模式如果存储在无符号int中,则不代表相同的值。因此,这是一个缩小转换和推广/扩大不涉及。
这是关于阅读标准的高雅艺术。像往常一样,编译器知道得最好。
发布于 2014-01-20 19:07:28
从int
到unsigned int
并没有一个整体的推广,因此还不完善。
这将是一个完整的转换。
https://stackoverflow.com/questions/21242070
复制相似问题