为什么?1> sizeof(int)?

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
Run Code Online (Sandbox Code Playgroud)

为什么是-1 > sizeof(int)真的?

  1. -1提升到unsigned(-1)那时是真的吗unsigned(-1) > sizeof(int)
  2. 这是真的,-1 > sizeof(int)相当于-1 > size_t(4)如果的sizeof(int)的是4,如果是这样的话,为什么-1 > size_t(4)是假的?

这个C++标准是否合适?

Art*_*yom 14

因为unsigned更强然后签名并且-1转换为无符号值size_t,所以实际上-1 == 0xFFFFFFFF > 4

这是它应该如何工作根据C++标准


小智 14

以下是标准(ISO 14882)如何解释abort -1> sizeof(int)

关系运算符`>'在5.9(expr.rel/2)中定义

通常的算术转换是在算术或枚举类型的操作数上执行的....

通常的算术转换定义为5(expr/9)

...该模式称为通常的算术转换,定义如下:

  • 如果任一操作数的类型为long double,...
  • 否则,如果任一操作数是dobule,...
  • 否则,如果任一操作数是浮点数,...
  • 否则,应对两个操作数执行整体促销.
  • ...

整体促销在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.

  • 它可能只是一个拼写错误,但`size_t`是_an_无符号整数类型,并且不必是`int`不能代表`size_t`的所有值的情况(`size_t`可能是`unsigned short` ),虽然它显然不能在问题的平台上提问. (2认同)
  • `(unsigned T)-1`不只是一个大值,它是*最大值`unsigned T`可以容纳的. (2认同)