Ale*_*tov 17 c++ unsigned sizeof type-conversion modular
请考虑以下代码:
template<bool> class StaticAssert;
template<> class StaticAssert<true> {};
StaticAssert< (-1 < sizeof(int)) > xyz1; // Compile error
StaticAssert< (-1 > sizeof(int)) > xyz2; // OK
为什么是-1 > sizeof(int)真的?
-1提升到unsigned(-1)那时是真的吗unsigned(-1) > sizeof(int)?-1 > sizeof(int)相当于-1 > size_t(4)如果的sizeof(int)的是4,如果是这样的话,为什么-1 > size_t(4)是假的?这个C++标准是否合适?
小智 14
以下是标准(ISO 14882)如何解释abort -1> sizeof(int)
关系运算符`>'在5.9(expr.rel/2)中定义
通常的算术转换是在算术或枚举类型的操作数上执行的....
通常的算术转换定义为5(expr/9)
...该模式称为通常的算术转换,定义如下:
整体促销在4.5中定义(conv.prom/1)
如果int可以表示源类型的所有值,则可以将char,signed char,unsigned char,short int或unsigned short int类型的rvalue转换为int类型的rvalue.否则,源rvalue可以转换为unsigned int类型的rvalue.
sizeof的结果在5.3.3中定义(expr.sizeof/6)
结果是size_t类型的常量
size_t在C标准(ISO 9899)中定义,它是无符号整数类型.
因此-1 > sizeof(int),>触发通常的算术转换.通常的算术转换将-1转换为unsigned int,因为int不能表示所有的值size_t.-1变得非常大,取决于平台.所以-1 > sizeof(int)是true.