char8_t
не то же самое, что char
. Он ведет себя точно так же, как unsigned char
, хотя согласно [basic.fundamental]/9
Тип char8_t
обозначает отдельный тип, базовым типом которого является unsigned char
. Типы char16_t
и char32_t
обозначают различные типы, базовыми типами которых являются uint_least16_t
и uint_least32_t
соответственно в <cstdint>.
.
выделено мной
Обратите внимание, что, поскольку стандарт называет его различным типом, такой код, как
std::cout << std::is_same_v<unsigned char, char8_t>;
напечатает 0
(false), хотя char8_t
реализовано как unsigned char
. Это потому, что это не псевдоним, а отдельный тип.
Следует также отметить, что char
может быть реализован как signed char
, так и unsigned char
. Это означает, что char
может иметь тот же диапазон и представление, что и char8_t
, но они по-прежнему являются отдельными типами. char
, signed char
, unsigned char
и char8_t
имеют одинаковый размер, но все они разных типов.
person
NathanOliver
schedule
07.08.2019
char8_t
— это 8-битный тип. Кроме того, знаковость char зависит от компилятора и целевой платформы: значения по умолчанию для ARM и PowerPC обычно не имеют знака, значения по умолчанию для x86 и x64 обычно имеют знак. в то время какchar8_t
всегда< /b> без знака. - person Elliott Frisch   schedule 08.08.2019char8_t
всегда содержит текст UTF-8 (за исключением ошибок), тогда как менее безопасно предполагать какую-либо конкретную кодировку строкиchar
без дополнительных знаний об окружающей среде. - person Miral   schedule 08.08.2019char
, как и большая часть наследия С++, всегда был раздражающе нарушен. Вы не знаете, подписано оно или нет, и, строго говоря, вы даже не знаете, сколько в нем битов (хотя 8 — довольно безопасная ставка, никакой гарантии нет). Типchar8_t
дает обе гарантии. К сожалению, никто не осмелился просто исправить поврежденный исходный тип (который, по общему признанию, мог сломать существующий код, но что с того... современный C++ в любом случае несовместим с устаревшим C++). Точно так же, как никто не мог побеспокоиться о том, чтобы сделатьsize_t
илиptrdiff_t
правильным типом. - person Damon   schedule 08.08.2019char8_t
было ровно восемь бит, поэтому в этом отношении ничего не изменилось… - person Holger   schedule 08.08.2019_least
или_fast
, которые, по крайней мере, такие же большие, и может быть, ну, в принципе, что угодно). - person Damon   schedule 08.08.2019char
имеет не менее 8 бит. POSIX и большинство других систем, таких как Windows, гарантируют, чтоchar
равно 8 битам. Но C не говорит Да, бла-бла POSIX. POSIX включает стандарт C, а не наоборот. И если C внезапно не решит отчуждать огромную часть своей ниши, они не собираются делать обязательным именно восьмибитный тип, потому что C является основным языком, используемым для программирования всего современного встраиваемого/нишевого оборудования, которое имеет байты больше восьми. биты. - person mtraceur   schedule 23.04.2020