Возьмем следующий стандартный проход:
[C++11: 5.3.3/6]:
Результатsizeof
иsizeof...
является константой типаstd::size_t
. [Примечание:std::size_t
определяется в стандартном заголовке<cstddef>
(18.2). -end note]
Сейчас:
[C++11: 18.2/6]:
Типsize_t
представляет собой целочисленный тип без знака, определенный для реализации, который достаточно велик, чтобы содержать размер в байтах любого объекта.
Конечно, в проходе не требуется, чтобы size_t
был псевдонимом типа, определенным с помощью typedef
, но поскольку он явно заявил, что он доступен стандартным заголовком <cstddef>
, я думаю, мы можем считать, что прочитаем, что если не включить <cstddef>
, следует удалить любую гарантию, что size_t
будет доступным для программы.
Однако, согласно этой первой цитате, мы можем независимо получить выражение типа std::size_t
.
Мы можем фактически продемонстрировать оба этих факта:
int main()
{
typedef decltype(sizeof(0)) my_size_t;
my_size_t x = 0; // OK
std::size_t y = 1; // error: 'size_t' is not a member of 'std'
}
std::size_t
не отображается программе, но sizeof(0)
все еще дает нам один? Действительно?
Нельзя ли сказать, что 5.3.3/6
является ошибочным и что он фактически имеет "тот же тип, что и любой std::size_t
разрешается", но не std::size_t
сам?
Конечно, эти два являются одинаковыми, если std::size_t
является псевдонимом типа, но, опять же, этого не требуется.