Я нашел эти выдержки в стандарте C ++ (цитаты взяты из N4687, но, вероятно, он будет существовать с тех пор навсегда):
[char.traits.typedefs]
Для определенного типа контейнера символов char_type
связанный тип контейнера INT_T
должен быть типом или классом, который может представлять все действительные символы, преобразованные из соответствующих значений char_type
, а такжезначение конца файла, eof()
.
[char.traits.require]
Выражение: X::eof()
Тип: X::int_type
Возвращает: значение e
такое, что X::eq_int_type(e,X::to_int_type(c))
равно false
для всех значений c
.
Выражение: X::eq_int_type(e,f)
Тип: bool
Возвращает: для всех c
и d
, X::eq(c,d)
равно X::eq_int_type(X::to_int_type(c), X::to_int_type(d))
(. ..)
c
и d
обозначают значения типа CharT
;(...);e
и f
обозначают значения типа X::int_type
[char.traits.specializations.char]
using char_type = char;
using int_type = int;
[basic.fundamental]
Обычные char
, signed char
и unsigned char
- это три различных типа, которые в совокупности называются узкими символьными типами. (...) A char
, signed char
и unsigned char
занимают одинаковый объем памяти и имеют одинаковые требования к выравниванию (...) Для узких типов символов все биты представления объекта участвуют впредставление значения. (...) Для беззнаковых типов узких символов каждый возможный битовый шаблон представления значения представляет отдельное число.
Существует пять стандартных целочисленных типов со знаком:«signed char
», «short int
», «int
», «long int
» и «long long int
». В этом списке каждый тип обеспечивает как минимум столько же памяти, сколько предшествующие ему в списке.
Я не нашел ничего, что могло бы помешать sizeof(int) == 1
в окружающем тексте. Это, очевидно, не относится к большинству современных платформ, где sizeof(int)
равно 4 или 8, но явно используется в качестве примера, например, в cppreference :
Примечание. случай, когда байты имеют размер 64 бита, все типы (включая char) имеют ширину 64 бита, а sizeof возвращает 1 для каждого типа.
Вопрос
Если int
былСтоль же большой, как char
, стандарт не оставляет много места для любого представления объекта первого, которое сравнивало бы неравное со всеми значениями (через to_int_type
) последнего, оставляя только некоторые угловые случаи (как отрицательный ноль, существующий в signed char
, но отображение на INT_MIN
в int
) вряд ли будет эффективно реализовано в аппаратном обеспечении. Более того, с P0907 кажется, что даже signed char
не допустит каких-либо двух разных битовых строк, представляющих равные значения, что приводит к принудительному присвоению ему 2 ^ (битового) различных значений, а также int
и закрытию каждоговозможная лазейка.
Как на такой платформе будет соответствовать требованиям std::char_traits<char>
? Есть ли у нас реальный пример такой платформы и соответствующей реализации?