Определяется ли следующая реализация:
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
или нет.