以下是实现定义的:
char *cp = "\x96\xA0\xB4\xBE\xC8";
还有:
std::string = "\x96\xA0\xB4\xBE\xC8";
char
在我的编译器 (MSVC 2015) 上表示 signed char
。
我认为我不能执行以下操作:
unsigned char *cp = "\x96\xA0\xB4\xBE\xC8";
"\x96\xA0\xB4\xBE\xC8"
是 0 - 255 范围内的字节,因此我的问题是:
以上是否取决于编译器?
最佳答案
Is the following implementation-defined:
signed char *cp = "\x96\xA0\xB4\xBE\xC8";
and as well as:
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)};
附言从字符串文字到非常量字符指针的转换格式错误(C++11 起;转换之前格式正确但已弃用)。
P.P.S char
, unsigned char
和 signed char
char
总是三种不同的类型是否签名。
关于c++ - 用字节初始化 char* 和 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56347861/