C++ C++;从无符号字符*到常量字符的样式转换*

C++ C++;从无符号字符*到常量字符的样式转换*,c++,constants,casting,C++,Constants,Casting,我有: unsigned char*foo(); std::字符串str; str.append(static_cast(foo())); 错误:从类型“unsigned char*”到类型“const char*”的静态转换无效。 < C++模式下的正确方法是什么?< Pr> RealTytCase < P>你需要使用 RealTytPask< /Cube >,因为两个类型之间的转换是彼此无关的。 尝试重新解释演员阵容 unsigned char *foo(); std::string st

我有:

unsigned char*foo();
std::字符串str;
str.append(static_cast(foo()));
错误:
从类型“unsigned char*”到类型“const char*”的静态转换无效。


< C++模式下的正确方法是什么?

< Pr> RealTytCase

< P>你需要使用<代码> RealTytPask< /Cube >,因为两个类型之间的转换是彼此无关的。 尝试重新解释演员阵容

unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));
unsigned char*foo();
std::字符串str;
str.append(reinterpret_cast(foo());

char*
const unsigned char*
被认为是不相关的类型。因此,您希望使用
重新解释\u cast


但是,如果要从
const unsigned char*
转换为非
const
类型,则需要首先使用
const\u cast
reinterpret\u cast
不能丢弃
const
volatile
限定。

无符号字符*基本上是一个字节数组,应该用来表示原始数据,而不是通常的字符串。unicode字符串将表示为wchar\t*

根据C++标准,无符号char和char之间的重新解释是安全的,因为它们大小相同,结构和约束相同。我尽量避免重复,甚至比一般的const_cast还要多

如果静态的转换失败了,你可能会想重新考虑你的设计,因为坦白地说,如果你使用C++,你可能想利用“加上”部分所提供的优势,使用字符串类和STL(AktST::Basic字符串可能对你更好)

希望能有所帮助


对不同的答案有太多的评论,所以我在这里留下另一个答案

在您的情况下,您可以而且应该使用
重新解释\u cast

const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;
str.append(reinterpret_cast(foo());
因为,虽然这两种类型不同,但2014年标准第3.9.1章基本类型[basic.basical]指出它们之间存在关系:

char
signed char
unsigned char
是三种不同的类型,统称为窄字符类型A
char
、A
signed char
和A
unsigned char
占用相同的存储量并具有相同的对齐要求(3.11);也就是说,它们具有相同的对象表示形式。

(选择是我的)

这里有一个可用的链接:


对Unicode/多字节字符串使用
wchar\u t
已过时:

无符号字符通常用于保存Unicode样式的字符串,您确定要直接强制转换它而不是转换内容吗?@jesse.co.tt感谢您的否决票。这篇文章的主要特点是它的及时性。其他答案提供了各种细节,最好单独阅读和投票。如果涵盖了你想要的内容,我会使用它和/或向上投票。你会注意到我也投入了时间来改进这些文件的格式。我真的不认为把这个答案扩展到其他答案的内容有什么意义。好吧,我理解你在这里的理由,作为一个整体,我同意没有必要重新表述。。。我想很难花时间看整个页面和时间戳,而不是根据每个答案的优劣来判断。。。但我要说的是(特别是从一个声誉比我高55倍的人那里!)@jesses.co.tt别担心,我理解你的观点,你也没有错。老实说,我已经很久没有在高流量标签上与西方最快的枪“竞争”了,就像这样。但是,即使你的答案是正确的,你也不会因为删除了它而获得如此高的声誉(换一天,我也会很高兴地和你争论)。没错,我们有一堵乱七八糟的文字墙,所以你的任务完成了:PI特别像你是如何如此关心喊“第一个!”,以至于你甚至都不关心
基本格式的问题。这真是一个毫无用处的“答案”。它只是没有提供任何信息。“无关”在这里是误导性的:它给人的印象是你无法从一个到另一个。我正在阅读2014年的一份草案,“3.9.1基本类型”,它说:“一个
字符
,一个
有符号字符
,和一个
无符号字符
占用相同的存储量,并且具有相同的对齐要求”。这是一种关系。或者这里有一个更可读的链接:
const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;
str.append(reinterpret_cast<const char*>(foo()));