用字节初始化char *和std :: string

时间:2019-05-28 18:08:53

标签: c++ arrays string c++17

以下实现定义为

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 个答案:

答案 0 :(得分:2)

  

以下实现定义为

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

以及:

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

在具有8位宽的签名char的系统上,可以。如果窄字符串文字中的十六进制转义序列超出为char定义的实现定义的范围,则它具有实现定义的值。假设8位带符号的char,则任何大于7F的十六进制值都超出可表示的值范围。

在此方面,该文字是用于初始化std::string还是指向字符的指针都是无关紧要的。


您可以使用unsigned char数组代替字符串文字:

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

如果需要,可以使用此数组初始化std::basic_string<unsigned char>

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

P.S。从字符串文字到非const char指针的转换格式不正确(自C ++ 11起;转换之前格式正确,但已弃用)。

P.P.S charunsigned charsigned char始终是三种不同的类型,无论char是否已签名。