Ответ 1
5.3.3 Размер [expr.sizeof]
1) Оператор sizeof дает количество байтов в объекте представление его операнда. Операнд является либо выражением, который является неоцененным операндом (п. 5) или скобкой тип-идентификатор. Оператор sizeof не применяется к выражению который имеет функцию или неполный тип, к заключенному в скобки имени такие типы или значение gl, которое обозначает бит-поле. SizeOf (char), sizeof (подпись char) и sizeof (без знака char) равны 1. Результат sizeof, примененный к любому другому фундаментальному типу (3.9.1), является реализации. [Примечание: в частности, sizeof (bool), sizeof (char16_t), sizeof (char32_t) и sizeof (wchar_t) являются определенная реализация .75 - примечание к концу] [Примечание: см. 1.7 для определение байта и 3.9 для определения объекта представление. - конечная нота]
6) Результат sizeof и sizeof... является константой типа std:: size_t. [Примечание: std:: size_t определяется в стандартном заголовке
<cstddef>
(18.2). - конечная нота]
Однако std::size_t
- это просто псевдоним типа. Оператор sizeof
может возвращать свой результат без необходимости "доступа" к псевдониму типа; результатом sizeof
является некоторый фундаментальный тип (реализация определена), который затем псевдонимом как std::size_t
в <cstddef>
.
Обратите также внимание, что в С++ typedef
или using
не следует определять новый тип (т.е. сильный тип), но только псевдоним (т.е. их typeid
совпадают). Следовательно, в вашем случае auto
просто выводит основной тип, возвращаемый оператором sizeof
, который совпадает с псевдонимом типа std::size_t
. Нет проблем для компилятора.