sizeof运算符的返回类型是什么?

时间:2013-11-08 23:13:22

标签: c++ visual-studio-2010 sizeof

sizeof运算符的返回类型是什么? cppreference.com& msdn说sizeof返回size_t。它真的返回size_t吗? 我正在使用VS2010 Professional,并针对x64。

int main()
{
    int size   = sizeof(int);     // No warning
    int length = strlen("Expo");  //warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data
    return 0;
}

我有这个问题,因为第一行没有发出任何警告,而第二行则没有。即使我将其更改为字符大小,我也不会收到任何警告。

3 个答案:

答案 0 :(得分:27)

C ++ 11,§5.3.3¶6

  

sizeofsizeof...的结果是std::size_t类型的常量。 [注意:std :: size_t的定义是   标准标题(18.2)。 - 结束说明]

您也可以快速检查:

#include <iostream>
#include <typeinfo>
#include <cstdlib>

int main()
{
    std::cout<<(typeid(sizeof(int))==typeid(std::size_t))<<std::endl;
    return 0;
}

在我的机器上正确输出1

正如 @Adam D. Ruppe 在评论中所说,可能编译器没有抱怨,因为它已经知道结果,它知道这种“转换”并不危险

答案 1 :(得分:4)

size_t是某些实现定义的无符号整数类型的别名。在与C相反的C ++中,sizeof运算符可以应用于VLA数组,不计算sizeof运算符的操作数(在运行时)。这是一个常数。如果sizeof运算符的值可以适合int类型,则编译器不会发出警告。 在第二个示例中,std :: strlen在运行时进行计算,因此其结果可能不适合int,因此编译器会发出警告。 你可以用你自己的constexpr函数(一些递归函数)替换std:; strlen。在这种情况下,如果结果适合int,我认为编译器不会发出警告。

答案 2 :(得分:0)

sizeof运算符用于获取类型或变量的大小(以字节为单位)。返回至少16位的无符号整数类型。它用于获得可移植性。

此警告是因为无符号整数,其中定义了size_t。