我有:
unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));
错误: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’
用C ++样式投射到这里的正确方法是什么?
Answers:
reinterpret_cast
basic formatting
。
char *
并被const unsigned char *
视为无关类型。所以你要用reinterpret_cast
。
但是,如果您要const unsigned char*
使用非const
类型,则需要先使用const_cast
。reinterpret_cast
无法放弃const
或volatile
资格。
char
,asigned char
和unsigned char
占据相同的存储量,并具有相同的对齐要求”。这是一种关系。或者,这里有一个更具可读性的链接:en.cppreference.com/w/cpp/language/types#Character_types
unsigned char *基本上是一个字节数组,通常应用于表示原始数据,而不是字符串。Unicode字符串将表示为wchar_t *
根据C ++标准,无符号char *和char *之间的reinterpret_cast是安全的,因为它们的大小相同且具有相同的构造和约束。通常,我尝试比const_cast更避免reintrepret_cast。
如果静态转换因您的操作而失败,则您可能需要重新考虑设计,因为坦率地说,如果您使用的是C ++,则可能想利用“ plus plus”部分提供的功能,并使用字符串类和STL(aka std :: basic_string可能更适合您)
无法对不同答案做出太多评论,因此在此我将留下另一个答案。
你可以和应该使用reinterpret_cast<>
,你的情况
str.append(reinterpret_cast<const char*>(foo()));
因为尽管这两种是不同的类型,但根据2014年标准,该章3.9.1 Fundamental types [basic.fundamental]
说它们之间存在关联:
平原
char
,signed char
并unsigned char
有三种不同的类型,统称为窄字符类型。Achar
,asigned char
和aunsigned char
占据相同的存储量,并具有相同的对齐要求(3.11);也就是说,它们具有相同的对象表示形式。
(选择是我的)
这是一个可用的链接:https : //en.cppreference.com/w/cpp/language/types#Character_types
使用wchar_t
:对Unicode /多字节字符串已经过时使用UTF-8的时候我应该使用wchar_t的?