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;
}
我有这个问题,因为第一行没有发出任何警告,而第二行则发出任何警告。即使我将其更改为字符大小,我也不会收到任何警告。
C++11,第 5.3.3 节 ¶6
和sizeof
的结果是sizeof...
类型的常量。 [ 注意:std::size_t 定义于 标准标题(18.2)。 — 尾注]std::size_t
您还可以快速检查:
#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 在评论中所说,编译器可能不会抱怨,因为它已经知道结果,它知道这种“转换”并不危险
size_t 是某些实现定义的无符号整数类型的别名。在与 C 相反的 C++ 中,sizeof 运算符可以应用于 VLA 数组,sizeof 运算符的操作数不会被评估(在运行时)。它是一个常数。如果 sizeof 运算符的值可以适合 int 类型,则编译器不会发出警告。 在第二个示例中,std::strlen 在运行时求值,因此其结果可能不适合 int,因此编译器会发出警告。 您可以用您自己的 constexpr 函数(某些递归函数)替换 std:;strlen 。在这种情况下,如果结果可以适合 int 我认为编译器不会发出警告。
sizeof 运算符用于获取类型或变量的大小(以字节为单位)。返回至少 16 位的无符号整数类型。它用于获得便携性。
此警告是因为定义了 size_t 的无符号整数。