缩小C++ 11中的转换:"转换后的实际值"是什么?

goo*_*era 8 c++ language-lawyer c++11

以下代码在C++ 11中是否合法?

int16_t x {0xaabb};
int64_t xxxx {0xaaaabbbbccccdddd};
Run Code Online (Sandbox Code Playgroud)

代码来自"The C++ Programming Language"第4版(第150页).

我们知道,列表初始化不允许缩小转换,在标准缩小转换的定义中,我们有:

缩小转换是一种隐式转换
- [...]
- 从整数类型或无范围枚举类型到不能表示原始类型的所有值的整数类型,除非源是常量表达式,而后是实际值转换将适合目标类型,并在转换回原始类型时生成原始值.

检查缩小转换对样本代码的规则中,我认为该示例代码是因为违法0xaabb0xaaaabbbbccccdddd不能代表int16_tint64_t分别.那是对的吗?

但我不太明白措辞"除了源是一个常量表达式,转换后的实际值将适合目标类型,并在转换回原始类型时产生原始值".我想知道在什么情况下转换后的实际值适合目标类型.由于整数类型之间的转换始终有效(尽管在目标类型已签名并且源值无法在目标类型中表示的情况下实现定义,但无论如何它都不是未定义的行为),"值是否始终为真" 转换将适合目标类型"?从这个角度来看,我开始质疑我对示例代码缩小转换的判断.如果是这种情况,为什么标准在某种情况下总是如此?为什么不说"除了源是一个常量表达式,转换后的实际值在转换回原始类型时会产生原始值"?

有人可以帮我澄清一下吗?谢谢!

小智 5

这是标准中的缺陷,请参阅CWG第1449期.该文字已更改为

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

注意:问题的状态DRWP意味着正式,标准尚未更改,并且可以建立一个参数,至少您的int64_t示例在C++ 11中是合法的.然而,编译器已经实现了新规则,因为这已经是原始措辞的预期含义.