创建字符数组以避免缩小

Bar*_*rry 6 c++ arrays narrowing c++11

我正在编写一个单元测试,检查一些预期数组的二进制数据.有问题的预期数组只是一些字节序列,具体并不重要:

char expected[] = {0x42, 0xde, 0xad, 0xbe, 0xef};
Run Code Online (Sandbox Code Playgroud)

这在C++中编译得很好,但是对于C++ 11,这会在缩小转换时发出警告.我编译-Werror因为警告很重要,所以这行不为我编译.据我所知,char没有文字后缀,所以看来我必须这样做:

char expected[] = {static_cast<char>(0x42), static_cast<char>(0xde), ... };
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很笨拙.有没有更好的方法来构造这个字符数组?(删除-Werror或添加之外-Wno-narrowing).

Sha*_*our 6

所以C++ 11有一个异常的整数类型和常量表达式的无范围枚举,它适合目标类型中的promtion,草案C++ 11标准部分8.5.4 [dcl.init.list]说:

从整数类型或未范围的枚举类型到不能表示原始类型的所有值的整数类型,除非源是一个常量表达式,其整数提升后的值将适合目标类型.

这里的问题是,char如果您使用unsigned char它而某些值不适合它应该工作.

clang更有帮助的是,它会警告哪些特定元素会生成警告,在这种情况下,它不会发出警告,0x42但会对其余元素发出警告,例如:

error: constant expression evaluates to 222 which cannot be narrowed to type 'char' [-Wc++11-narrowing]
char expected[] = {0x42, 0xde, 0xad, 0xbe, 0xef};
                         ^~~~
Run Code Online (Sandbox Code Playgroud)