如何解决从std :: string <char>到unsigned char [],错误“无法缩小非常数表达式”
有错误消息:
non-constant-expression cannot be narrowed from type 'std::basic_string<char,std::char_traits<char>,std::allocator<char> >::value_type' (aka 'char') to 'unsigned char' in initializer list [-Wc++11-narrowing]
。
MSVC 和 GCC 将问题视为警告,但 Clang 将其视为错误。
代码:
enum Encoding { ERR = -1,NONE,ASCII,UTF8,UTF16LE,UTF16BE,UTF32LE,UTF32BE };
Encoding CheckBOM(const std::string& data) {
unsigned int DataSize = data.length();
if (DataSize < 4)
return ERR;
// the following line is the cause of the problem
unsigned char BOM[4] = { data[0],data[1],data[2],data[3] }; // <-- This line is what the error message points to
if (BOM[0] == 0xef && BOM[1] == 0xbb && BOM[2] == 0xbf)
return Encoding::UTF8;
else if (BOM[0] == 0xff && BOM[1] == 0xfe && BOM[2] == 0x00 && BOM[3] == 0x00)
return Encoding::UTF32LE;
else if (BOM[0] == 0x00 && BOM[1] == 0x00 && BOM[2] == 0xfe && BOM[3] == 0xff)
return Encoding::UTF32BE;
else if (BOM[0] == 0xff && BOM[1] == 0xfe)
return Encoding::UTF16LE;
else if (BOM[0] == 0xfe && BOM[1] == 0xff)
return Encoding::UTF16BE;
return Encoding::NONE;
}
我试图解决该问题,但由于不了解,所以无法解决。
我该如何解决?
解决方法
由于std::string
为basic_string<char>
,因此您要为char
分配一个有符号的类型unsigned char
,从而缩小范围。
狭义转换是一种隐式转换,其中转换后的类型不能在所有情况下都由目标类型表示,这种情况就是将有符号转换为无符号。
由于该标准不允许在聚合初始化(即braced-init-list)中缩小转换范围,因此您必须自己“手动”完成操作。
[...] 如果该初始值设定项的形式为Assignment-expression或= Assignment-expression,并且需要转换为窄变([dcl.init.list]),则程序格式不正确 [...]
缩小转换是隐式转换
[...]
[可能的隐式转换列表,分析中不需要此内容]
[...]
[注意:如上所述,在列表初始化中,不允许在顶层进行此类转换。 —尾注]
[示例:
[...]
unsigned char uc1 = {5}; //好:无需缩小
unsigned char uc2 = {-1}; //错误:缩小
unsigned int ui1 = {-1}; //错误:缩小
[...]
为避免错误/警告,您可以强制转换为unsigned char
:
unsigned char BOM[4] = { static_cast<unsigned char>(data[0]),static_cast<unsigned char>(data[1]),static_cast<unsigned char>(data[2]),static_cast<unsigned char>(data[3])};
作为替代方案,您可以使用suggested by @RemyLebeau:
const unsigned char * pdata = reinterpret_cast<const unsigned char *>(data.c_str());
unsigned char BOM[4] = { pdata[0],pdata[1],pdata[2],pdata[3] };
或更简单:
unsigned char BOM[4];
std::memcpy(BOM,data.c_str(),4);
这需要#include<cstring>
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。