【发布时间】:2013-03-14 05:07:06
【问题描述】:
common_type<long, unsigned long>::type 是 unsigned long 因为标准说关于积分提升后的操作数...
[...] 如果具有无符号整数类型的操作数的秩大于或 等于另一个操作数的类型的等级,操作数与 有符号整数类型应转换为操作数的类型 无符号整数类型
不要称积分提升系统有问题,但似乎如果有更大的有符号整数类型可以表示有符号和无符号操作数的范围,则应该使用它。
我知道有些平台可能有 long == long long,在这种情况下,上面的规则可以生效。但是如果有更大的有符号整数类型可用,不应该使用它吗?
【问题讨论】:
-
我不相信
long long将涵盖unsigned long的整个范围。如果它像其他大小规范一样,唯一的要求是它至少用与long一样多的位表示。无论平台如何,类型提升都应该表现一致,因此对于重载解决方案有一定的可预测性。 -
std::common_type匹配确定三元运算符返回类型的规则。从这个角度来看,三元运算符返回的类型大于其两个分支中的任何一个似乎显然是错误的。 -
@KevinBallard 我实际上并不认为这显然是错误的。当分支返回不同的签名时返回一个大于其任何一个分支的类型似乎是唯一可以保证没有错误的事情。
-
@KevinBallard 你希望
(b?(unsigned char)255:(signed char)-1)做什么? -
@Sh3ljohn 积分提升规则是......奇怪。小于
int的类型提升为int。我发布的规则在整体升级后适用。
标签: c++ language-lawyer integer-promotion