Являются ли `char16_t` и` char32_t` неправильными?

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 указать типы фиксированной ширины.

Мой вопрос в следующем: я воображаю вещи, или эти имена в корне неверны?

9

Решение

Соглашение об именах, на которое вы ссылаетесь (uint32_t, int_fast32_tи т. д.) фактически используется только для Определения типов, и не для примитивных типов. Примитивные целочисленные типы: {подписанный, беззнаковый} {символ, короткий, int, длинный, длинный длинный}, {в отличие от типов с плавающей запятой или десятичных типов} …

Однако в дополнение к этим целочисленным типам существует четыре отчетливый, уникальные, фундаментальные типы, char, wchar_t, char16_t а также char32_tкоторые являются типами соответствующих литералов '', L'', u'' а также U'' и используются для данных буквенно-цифрового типа, а также для их массивов. Эти типы, конечно, также являются целочисленными типами, и поэтому они будут иметь одинаковое расположение немного из целочисленных арифметических типов, но язык делает очень четкое различие между первыми, арифметическими типами (которые вы использовали бы для вычислений) и последними «символьными» типами, которые образуют базовую единицу некоторого типа данных ввода / вывода.

(Я ранее бродил об этих новых типах Вот а также Вот.)

Итак, я думаю, что char16_t а также char32_t на самом деле очень удачно названы, чтобы отразить тот факт, что они принадлежат к семейству «char» целочисленных типов.

12

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

эти имена в корне ошибочны?

(Я думаю, что на большинство вопросов ответили в комментариях, но для ответа) Нет, совсем нет. char16_t а также char32_t были созданы для конкретной цели. Чтобы иметь поддержку типов данных для всех форматов кодирования Unicode (UTF-8 покрывается charсохраняя их как можно более общими, чтобы не ограничивать их только Unicode. Являются ли они без знака или имеют фиксированную ширину, не имеет прямого отношения к тому, что они: типы символьных данных. Типы, которые содержат и представляют персонажи. Подпись — это свойство типов данных, которые представляют чисел не персонажи. Типы предназначены для хранить персонажей, 16-битные или 32-битные символьные данные, ничего более или менее.

4

Они есть не принципиально ущербный, по определению — они являются частью стандарта. Если это оскорбляет ваши чувства, то вы должны найти способ с этим справиться. Время выдвигать этот аргумент было до того, как последний стандарт был ратифицирован, и это время давно прошло.

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