Подтвердить что ты не робот

Несоответствие для size_t и sizeof

Не правда ли, что результат собственного оператора не может быть определен без включения файла заголовка?

В соответствии с этой страницей, size_t определяется в заголовках cstddef, cstdio, cstring, ctime и cstdlib. Таким образом, если ни один из этих заголовков не включен, то size_t должен быть undefined. Однако следующая программа компилируется без предупреждения (с использованием MSVC 2015RC).

int main()
{
    auto d_Size = sizeof( int );
    return 0;
}

Кажется, что size_t - это нечто вроде ублюдка между нативным типом и typedef. Что говорит стандарт?

4b9b3361

Ответ 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. Нет проблем для компилятора.

Ответ 2

В соответствии со стандартом С++ std::size_t определяется в <cstddef>.

5.3.3 Размер

...

6 Результат sizeof и sizeof... является константой типа std::size_t. [Примечание: std::size_t определяется в стандартный заголовок <cstddef> (18.2). - конечная нота]