Инициализация char * и std :: string с байтами - PullRequest
1 голос
/ 28 мая 2019

Определяется ли следующая реализация:

char *cp = "\x96\xA0\xB4\xBE\xC8";

, а также:

std::string = "\x96\xA0\xB4\xBE\xC8";

char означает signed char в моем компиляторе (MSVC 2015).

Я понял, что не могу сделать следующее:

unsigned char *cp = "\x96\xA0\xB4\xBE\xC8";

"\x96\xA0\xB4\xBE\xC8" - это байты в диапазоне 0 - 255, поэтому мой вопрос:

Имеет ли вышесказанноезависеть от компилятора?

1 Ответ

2 голосов
/ 28 мая 2019

Определяется ли следующая реализация:

signed char *cp = "\x96\xA0\xB4\xBE\xC8";

, а также:

std::string = "\x96\xA0\xB4\xBE\xC8";

В системах с шириной 8-битной подписи char, да.Шестнадцатеричная escape-последовательность в узком строковом литерале имеет значение, определяемое реализацией, если оно выходит за пределы диапазона, определенного для реализации, определенного для char.Предполагая 8-разрядное знаковое char, любое шестнадцатеричное значение, большее 7F, выходит за пределы диапазона представимых значений.

Используется ли этот литерал для инициализации std::string или указатель на символ не имеет значения в


Вы можете использовать массив unsigned char вместо строкового литерала:

static constexpr unsigned char cp[] = {
    0x96,
    0xA0,
    0xB4,
    0xC8,
};

Вы можете использовать этот массив для инициализации std::basic_string<unsigned char>, если вам нужноit:

 std::basic_string<unsigned char> s = {std::begin(cp), std::end(cp)};

PS Преобразование из строкового литерала в неконстантный указатель на символ некорректно (начиная с C ++ 11; до этого преобразование было корректным, но не рекомендуется).

PPS char, unsigned char и signed char всегда являются тремя различными типами независимо от того, подписано char или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...