2014-05-20 3 views
6

Или это может быть отдельный целочисленный тип без знака?Является ли size_t гарантией быть псевдонимом одного из целочисленных типов?

У меня есть разные специализации функции шаблона для разных (беззнаковых) целых типов. Нужно ли предоставлять отдельную специализацию для size_t?

+0

Вы сказали «функция шаблона», поэтому я удалил несвязанный тег 'c'. –

+0

http://www.cplusplus.com/reference/cstring/size_t/ похоже, что это псевдоним, хотя у меня нет стандарта. Если это правильно http://stackoverflow.com/a/1089181/3093378, то это всегда 'unsigned', но не уверен, что он всегда является псевдонимом. – vsoftco

+0

Я посмотрел на этот пост. Он не говорит, что 'size_t' определяется как псевдоним. Так может ли это быть, например, 64-битный без знака, и вести себя как «unsigned long», но не определяться как «typedef unsigned long size_t» и быть автономным? Или это всегда псевдоним? – user2052436

ответ

6

Стандарта C++ говорит:

18,2/2 Содержания такой же, как заголовок стандартной библиотеки C, со следующими изменениями:

18,2/6 Типом size_t является реализация определенного unsigned integer, который достаточно велик, чтобы содержать размер в байтах любого объекта.

18,2/7 [Примечание: Рекомендуется, чтобы реализация выбрать типы для ptrdiff_t и size_t которого целого рядов преобразования (4.13) не больше, чем знаковое долгого междунар если больший размер не нужен содержать все возможное значения. -end примечание]

Таким образом, не сказать будет явно ли реализация определенных целое без знака типа быть один из unsigned short, int, long, long long. Тот факт, что существует 18.2/6 и указывает «целочисленный тип без знака, определенный реализацией», может рассматриваться как переопределяющий значение по умолчанию 18.2/2 по следующему C, поэтому любой ответ для C нельзя доверять для C++.

Считается, что в соответствии с рекомендациями, приведенными в ранге преобразования, size_t будет одним из типов, упомянутых в 4.13, где size_t явно не упоминается, но очевидными кандидатами являются, но это не гарантия.

Нужно ли предоставлять отдельную специализацию для size_t?

Вы можете использовать std::is_same и std::enable_if, чтобы сделать это, когда size_t это особый тип ....

+0

'std :: is_same' и' std :: enable_if' решает его. благодаря – user2052436

0

От стандарта (§ 18.2) от N3797 Опубликовано 13.10.2013:

Тип size_t является реализацией определенных целое число без знака типа, который достаточно велик, чтобы содержать размер в байтах любой объект.

Так должно быть интегральный тип без знака, но фактический размер определяется реализацией.

+1

Я не вижу, где он говорит, что это псевдоним некоторого целого типа без знака. – user2052436

+0

@ пользователь2052436, см. Ссылку. – Rakib

+0

@RakibulHasan ваше сообщение неясно. Начиная с «Да», похоже, что вы отвечаете «Да» на название вопроса OP (когда на самом деле ответ на заголовок «Нет», но ответ на первую строчку его почтового тела «Да» «). –

1

Текст из [support.types]:

содержимое такие же, как заголовок стандартной библиотеки C , со следующими изменениями:

Тип size_t - это целочисленный тип без знака, определенный по реализации, который достаточно велик, чтобы содержать размер в байтах любого объект.

Из спецификации C99 в stddef.h есть и эта сноска для разъяснения:

224) Некоторые из этих типов могут означать реализации определенных типов расширенного целочисленные.

Поскольку C++ стандартного текст конкретно не говорит, что, поскольку, как представляется, на основе C99 size_t должен быть ЬурейиМ, и, мне кажется, что мы должны сделать вывод, что это может быть от реализации расширенного целого тип.

Сказав это, я не знаю никакой реализации, для которой это не typedef.

Я не уверен, что вы должны делать с проблемой перегрузки, однако обратите внимание, что она не ограничена только size_t; есть также ptrdiff_t и все целые числа фиксированной ширины. Последние указаны как typedef s, однако они могут быть псевдонимами для расширенных целочисленных типов.

Смежные вопросы