Оператор sizeof не оценивает используемое выражение как его операнд. Он определяет тип выражения и возвращает размер, который может иметь объект типа.
Например, если у вас есть следующий фрагмент кода
int i = 10;
std::cout << sizeof( ++i ) << '\n';
, тогда значение переменной i
не изменится.
Из стандарта C ++ 17 (5.3.3 Sizeof)
1 Оператор sizeof возвращает количество байтов в объектном представлении своего операнда , Операндом является либо выражение, которое является неоцененным операндом (раздел 5), либо идентификатор типа в скобках ....
Чтобы определить тип используемого выражения в этом размере операнда
cout<<sizeof(a+b);
выводится общий тип операндов аддитивного оператора + с использованием обычных арифметических c преобразований.
Поскольку ранг типа long равен чем ранг типа int, то общий тип выражения long, а оператор sizeof возвращает размер объекта типа long.