Каков возвращаемый тип оператора 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;
}

У меня есть этот вопрос, потому что первая строка не выдает предупреждения, а вторая делает. Даже если я изменю его на размер char, я не получаю никаких предупреждений.

Ответ 1

С++ 11, §5.3.3 ¶6

Результат sizeof и sizeof... является константой типа 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 в комментарии, вероятно, компилятор не жалуется, потому что, поскольку он уже знает результат, он знает, что такое "преобразование" не опасно

Ответ 2

size_t является псевдонимом определенного неподписанного целочисленного типа, определенного для реализации. В С++ напротив C, где оператор sizeof может применяться к массивам VLA, операнд оператора sizeof не оценивается (во время выполнения). Это постоянная. Если значение оператора sizeof может быть помещено в тип int, компилятор не выдаст предупреждение. Во втором примере std:: strlen оценивается во время выполнения, поэтому его результат может не вписываться в int, поэтому компилятор выдает предупреждение. Вы можете заменить std:; strlen своей собственной функцией constexpr (некоторая рекурсивная функция). В этом случае, если результат может поместиться в int, я думаю, что компилятор не выдаст предупреждение.

Ответ 3

Оператор sizeof используется для получения размера типов или переменной в байтах. Возвращает целочисленный тип без знака не менее 16 бит. Он использовался для обеспечения переносимости.

Это предупреждение связано с целым числом без знака, где определяется size_t.