NB: Я уверен, что кто-то назовет это субъективным, но я считаю, что это довольно ощутимо.
C ++ 11 дает нам новое basic_string
типы std::u16string
а также std::u32string
введите псевдонимы для std::basic_string<char16_t>
а также std::basic_string<char32_t>
соответственно.
Использование подстрок "u16"
а также "u32"
для меня в этом контексте скорее подразумеваются «UTF-16» и «UTF-32», что было бы глупо, поскольку в C ++, конечно, нет понятия кодирования текста.
На самом деле имена отражают типы символов char16_t
а также char32_t
, но они кажутся неправильно названными. Oни являются без знака, из-за неподписанности их основных типов:
[C++11: 3.9.1/5]:
[..] Типыchar16_t
а такжеchar32_t
обозначают различные типы с тем же размером, подписью и выравниванием, что иuint_least16_t
а такжеuint_least32_t
соответственно [..]
Но тогда мне кажется, что эти имена нарушают соглашение о том, что такие неподписанные типы имеют имена, начинающиеся с 'u'
и что использование чисел типа 16
неквалифицированный такими терминами, как least
указать типы фиксированной ширины.
Мой вопрос в следующем: я воображаю вещи, или эти имена в корне неверны?
Соглашение об именах, на которое вы ссылаетесь (uint32_t
, int_fast32_t
и т. д.) фактически используется только для Определения типов, и не для примитивных типов. Примитивные целочисленные типы: {подписанный, беззнаковый} {символ, короткий, int, длинный, длинный длинный}, {в отличие от типов с плавающей запятой или десятичных типов} …
Однако в дополнение к этим целочисленным типам существует четыре отчетливый, уникальные, фундаментальные типы, char
, wchar_t
, char16_t
а также char32_t
которые являются типами соответствующих литералов ''
, L''
, u''
а также U''
и используются для данных буквенно-цифрового типа, а также для их массивов. Эти типы, конечно, также являются целочисленными типами, и поэтому они будут иметь одинаковое расположение немного из целочисленных арифметических типов, но язык делает очень четкое различие между первыми, арифметическими типами (которые вы использовали бы для вычислений) и последними «символьными» типами, которые образуют базовую единицу некоторого типа данных ввода / вывода.
(Я ранее бродил об этих новых типах Вот а также Вот.)
Итак, я думаю, что char16_t
а также char32_t
на самом деле очень удачно названы, чтобы отразить тот факт, что они принадлежат к семейству «char» целочисленных типов.
эти имена в корне ошибочны?
(Я думаю, что на большинство вопросов ответили в комментариях, но для ответа) Нет, совсем нет. char16_t
а также char32_t
были созданы для конкретной цели. Чтобы иметь поддержку типов данных для всех форматов кодирования Unicode (UTF-8 покрывается char
сохраняя их как можно более общими, чтобы не ограничивать их только Unicode. Являются ли они без знака или имеют фиксированную ширину, не имеет прямого отношения к тому, что они: типы символьных данных. Типы, которые содержат и представляют персонажи. Подпись — это свойство типов данных, которые представляют чисел не персонажи. Типы предназначены для хранить персонажей, 16-битные или 32-битные символьные данные, ничего более или менее.
Они есть не принципиально ущербный, по определению — они являются частью стандарта. Если это оскорбляет ваши чувства, то вы должны найти способ с этим справиться. Время выдвигать этот аргумент было до того, как последний стандарт был ратифицирован, и это время давно прошло.