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页).
我们知道,列表初始化不允许缩小转换,在标准缩小转换的定义中,我们有:
缩小转换是一种隐式转换
- [...]
- 从整数类型或无范围枚举类型到不能表示原始类型的所有值的整数类型,除非源是常量表达式,而后是实际值转换将适合目标类型,并在转换回原始类型时生成原始值.
检查缩小转换对样本代码的规则中,我认为该示例代码是因为违法0xaabb而0xaaaabbbbccccdddd不能代表int16_t和int64_t分别.那是对的吗?
但我不太明白措辞"除了源是一个常量表达式,转换后的实际值将适合目标类型,并在转换回原始类型时产生原始值".我想知道在什么情况下转换后的实际值不适合目标类型.由于整数类型之间的转换始终有效(尽管在目标类型已签名并且源值无法在目标类型中表示的情况下实现定义,但无论如何它都不是未定义的行为),"值是否始终为真" 后转换将适合目标类型"?从这个角度来看,我开始质疑我对示例代码缩小转换的判断.如果是这种情况,为什么标准在某种情况下总是如此?为什么不说"除了源是一个常量表达式,转换后的实际值在转换回原始类型时会产生原始值"?
有人可以帮我澄清一下吗?谢谢!