common_type<long, unsigned long>::type
是unsigned long
,因为有关整数提升后的操作数,标准规定如下:如果带有无符号整数类型的操作数的等级大于或等于另一个操作数的类型的等级,则具有有符号整数类型的操作数应转换为具有无符号整数类型的操作数的类型。
并不是说整数提升系统有问题,但如果有更大的有符号整数类型可以表示两个有符号和无符号操作数的范围,那么它应该被使用。
我知道某些平台可能会将long == long long,在这种情况下,上述规则可以生效。但是,如果有更大的有符号整数类型可用,不应该使用它吗?
long long
能够完全覆盖unsigned long
的整个范围,如果它像其他大小规格说明一样,唯一的要求是用至少与long
一样多的位表示。类型提升应该在各个平台上表现出统一性,因此在重载分辨率方面存在一定的可预测性。 - jpmstd::common_type
匹配确定三元运算符返回类型的规则。从这个角度来看,三元运算符返回比其两个分支中任何一个更大的类型显然是错误的。 - Lily Ballard(b?(unsigned char)255:(signed char)-1)
做什么? - Yakk - Adam Nevraumontint
小的类型会被提升为int
。我发布的规则是在整数提升之后应用的。 - David