C++ 使用字节初始化char*和std::字符串
是否定义了以下实现:C++ 使用字节初始化char*和std::字符串,c++,arrays,string,c++17,C++,Arrays,String,C++17,是否定义了以下实现: char *cp = "\x96\xA0\xB4\xBE\xC8"; signed char *cp = "\x96\xA0\xB4\xBE\xC8"; 以及: std::string = "\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";
signed char *cp = "\x96\xA0\xB4\xBE\xC8";
以及:
std::string = "\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范围内的字节,因此我的问题是:
以上内容是否取决于编译器
是否定义了以下实现:
char *cp = "\x96\xA0\xB4\xBE\xC8";
signed char *cp = "\x96\xA0\xB4\xBE\xC8";
以及:
std::string = "\x96\xA0\xB4\xBE\xC8";
std::string = "\x96\xA0\xB4\xBE\xC8";
在具有8位宽有符号字符的系统上,是。如果窄字符串文字中的十六进制转义序列超出为char
定义的实现定义范围,则该序列具有实现定义的值。假设8位有符号字符,任何大于7F的十六进制值都超出可表示值的范围
在这方面,该文本是否用于初始化std::string
或字符指针无关紧要
您可以使用
无符号字符数组
代替字符串文字:
static constexpr unsigned char cp[] = {
0x96,
0xA0,
0xB4,
0xC8,
};
如果需要,可以使用此数组初始化std::basic_字符串
:
std::basic_string<unsigned char> s = {std::begin(cp), std::end(cp)};
std::basic_string s={std::begin(cp),std::end(cp)};
另外,从字符串文字到非常量字符指针的转换格式不正确(因为C++11;之前的转换格式正确,但不推荐使用)
p.p.S
char
,unsigned char
和signed char
始终是三种不同的类型,无论char
是否有符号。char
与signed char
永远不是同一类型,即使char
是有符号类型。字符串文本是const
。你说“我不能做”是什么意思?问题是什么<代码>标准::字符串=“\x96\xA0\xB4\xBE\xC8”不编译char
可以是有符号的,也可以是无符号的,在这两种情况下,它与signed char
或unsigned char
的类型不同,这是语言的一个怪癖,不要尝试获取它的逻辑否,char
是无符号的或有符号的,但是无论是usigned char
还是signed char
:有可能使这个定义良好且不依赖于编译器吗?例如,我不能这样做:unsigned char*cp=“\x96\xA0\xB4\xBE\xC8”
是否有必要?@user963241这无助于使字符串文本的值独立于编译器。您可以改为使用数组,如我的编辑中所示。是的,我的意思是有符号性是实现定义的,并且值例如“\x96”的解释方式也是实现定义的,但是如果我们执行unsigned char c='\x96'
,则它是定义良好的。@user963241是的,对每个语句。尽管正确的语法是无符号字符c=0x96
;不存在一个字符小于8位或不是2位补码的计算机系统。看起来C++20最终会成功。