Reputation: 1035
What is the return type of sizeof
operator? cppreference.com & msdn says sizeof
returns size_t
. Does it really return a size_t
?
I'm using VS2010 Professional, and targeting for 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;
}
I have this question because first line is not issuing any warning, whereas the second does. Even if I change it to char size, I don't get any warnings.
Upvotes: 65
Views: 103127
Reputation: 29
The sizeof operator is used to get the size of types or variables in bytes. Returns an unsigned integer type of at least 16 bit. It's used to get portability.
This warning is because of the unsigned integer where is defined the size_t.
Upvotes: 3
Reputation: 310970
size_t is an alias of some implementation-defined unsigned integral type. In C++ opposite to C where sizeof operator may be applied to VLA arrays the operand of sizeof operator is not evaluated (at run time). It is a constant. If the value of sizeof operator can be fit into int type the compiler does not issue a warning. In the second example std::strlen is evaluated at run time so its result can do not fit into int so the compiler issues a warning. You could substitute std:;strlen with your own constexpr function (some recursive function). In this case if the result can fit into int I think that the compiler will not issue a warning.
Upvotes: 9
Reputation: 126787
C++11, §5.3.3 ¶6
The result of
sizeof
andsizeof...
is a constant of typestd::size_t
. [ Note: std::size_t is defined in the standard header (18.2). — end note ]
You can also do a quick check:
#include <iostream>
#include <typeinfo>
#include <cstdlib>
int main()
{
std::cout<<(typeid(sizeof(int))==typeid(std::size_t))<<std::endl;
return 0;
}
which correctly outputs 1
on my machine.
As @Adam D. Ruppe said in the comment, probably the compiler does not complain because, since it already knows the result, it knows that such "conversion" is not dangerous
Upvotes: 38