Стандарта 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
это особый тип ....
Вы сказали «функция шаблона», поэтому я удалил несвязанный тег 'c'. –
http://www.cplusplus.com/reference/cstring/size_t/ похоже, что это псевдоним, хотя у меня нет стандарта. Если это правильно http://stackoverflow.com/a/1089181/3093378, то это всегда 'unsigned', но не уверен, что он всегда является псевдонимом. – vsoftco
Я посмотрел на этот пост. Он не говорит, что 'size_t' определяется как псевдоним. Так может ли это быть, например, 64-битный без знака, и вести себя как «unsigned long», но не определяться как «typedef unsigned long size_t» и быть автономным? Или это всегда псевдоним? – user2052436