Может ли cstdint typedefs связываться с некоторыми специфическими для реализации типами, для которых std::numeric_limits не специализируется?
Возможно ли, по крайней мере теоретически, что привязки типа cstdint связываются с некоторыми типами реализации, для которых std::numeric_limits не специализируется?
Согласно http://www.cplusplus.com/reference/limits/numeric_limits, позвольте мне процитировать: "[std::numeric_limits] специализируется для каждого фундаментального арифметического типа, его члены описывают свойства типа T. Этот шаблон не должен быть специализированным для любого другого типа."
Согласно http://en.cppreference.com/w/cpp/types/numeric_limits, позвольте мне еще раз процитировать: "реализации могут предоставлять специализации std::numeric_limits для типов, специфичных для реализации".
"Май", говорит cppreference. Так что они не должны.
И, наконец, согласно http://www.cplusplus.com/reference/cstdint, определения типов, определенные в заголовке, "являются определениями типов фундаментальных целочисленных типов или расширенных целочисленных типов".
Итак, чтобы подвести итог - кажется, что определения типа cstdint могут связываться с расширенными целочисленными типами (какими бы они ни были), которые не являются фундаментальными целочисленными типами (опять же, какими бы они ни были) и, следовательно, могут быть несовместимы с std::numeric_limits . Это правильно?
Тем не менее, документы, на которые я ссылался, кажутся слегка противоречивыми в одном. Разве cplusplus.com не запрещает, что std::numeric_limits не должен быть специализированным для какого-либо неосновного арифметического типа в противоположность допущению cppreference, что std::numeric_limits может быть специализированным для специфичных для реализации типов? Если, конечно, эти специфичные для реализации типы на самом деле не являются фундаментальными целочисленными типами, в этом случае, мы надеемся, что std::numeric_limits должен был бы быть специализированным для всех типов определения cstdint.
Документация смущает меня. Поэтому я задаю свой вопрос здесь:)
РЕДАКТИРОВАТЬ.
Согласно http://eel.is/c++draft/cstdint, cstdint должен связываться с целочисленными типами. И согласно http://eel.is/c++draft/limits.numeric, "Специализации должны быть предоставлены для каждого арифметического типа, как с плавающей точкой, так и с целым числом, включая bool". Является ли понимание того, что целочисленный тип является арифметическим типом, и поэтому std::numeric_limits должен быть специализирован для правильной определения типа cstdint?
1 ответ
Специализации, такие как std::numeric_limits<std::int_fast32_t>
должен существовать.
3.9.1 / 2:
Существует пять стандартных целочисленных типов со знаком:
signed char
","short int
","int
","long int
", а также "long long int
Msgstr ". .. Также могут существовать расширенные типы со знаком со знаком, определенные реализацией. Стандартные и расширенные типы со знаком со знаком называются целочисленными типами со знаком.
3.9.1 / 3:
Для каждого из стандартных целочисленных типов со знаком существует соответствующий (но различный) стандартный целочисленный тип без знака.... Аналогично, для каждого из расширенных целочисленных типов со знаком существует соответствующий расширенный целочисленный тип без знака.... Стандарт и расширенные целочисленные типы без знака вместе называются целочисленными типами без знака.
3.9.1 / 7:
Типы
bool
,char
,char16_t
,char32_t
,wchar_t
и целочисленные типы со знаком и без знака вместе называются целочисленными типами. Синоним для целочисленного типа - целочисленный тип.
3.9.1 / 8:
Интегральные и плавающие типы вместе называются арифметическими типами. Специализации стандартного шаблона
std::numeric_limits
(18.3) должен указывать максимальное и минимальное значения каждого арифметического типа для реализации.
18.3.2.1/2:
Специализации
numeric_limits
] должно быть указано для каждого арифметического типа, как с плавающей точкой, так и целого числа, включаяbool
,
18.4.1:
namespace std {
typedef signed_integer_type int8_t; // optional
//...
typedef unsigned_integer_type uint8_t; // optional
//...
}
Таким образом, типы, определенные в <cstdint>
могут быть расширенными типами, но определенно являются целочисленными типами и поэтому должны иметь соответствующие специализации std::numeric_limits
,
Кроме того, все целочисленные типы являются "фундаментальными" в том смысле, в каком они используются в Стандарте (3.9), хотя не все являются стандартными типами.