Может ли 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 , typedefs, определенные в заголовкеявляются определениями типов фундаментальных целочисленных типов или расширенных целочисленных типов».

Итак, чтобы подвести итог — кажется, что cstdint typedefs может связываться с расширенные целочисленные типы (какими бы они ни были), которые не являются основные интегральные типы (опять же, какими бы они ни были) и поэтому могут быть несовместимы с 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?

0

Решение

Специализации, такие как std::numeric_limits<std::int_fast32_t> должен существовать.

3.9.1 / 2:

Есть пять стандартные целочисленные типы со знаком: «signed char«,»short int«,»int«,»long int«, а также «long long intMsgstr «… Также может быть определена реализация расширенные целые типы со знаком. Стандартные и расширенные целочисленные типы со знаком называются вместе целочисленные типы со знаком.

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), хотя не все являются стандартными типами.

4

Другие решения


По вопросам рекламы [email protected]