【问题标题】:constant expression evaluates to -1 which cannot be narrowed to type 'char' [-Wc++11-narrowing] error常量表达式的计算结果为 -1,不能缩小为类型 'char' [-Wc++11-narrowing] 错误
【发布时间】:2021-01-22 13:46:17
【问题描述】:

我正在使用旧代码,并且在使用较新的 C++ 标准进行编译时,每个 -1 都会出错。

constant expression evaluates to -1 which cannot be narrowed to type 'char' [-Wc++11-narrowing]

这里是sn-p代码

typedef struct {
    //short     len;
    //unsigned short cw;
    char        x, y, v, w;
} testStruct;

const testStruct testArr[] = {
    {   1,  -1,   0,   0},
    {  -1,   1,   0,   0},
    {   0,   0,  -1,   1},
    {   0,   1,  -1,   0},
    {   0,  -1,   1,   0},
    {   0,   0,   1,  -1},
    {   1,   1,   0,   0},
    {   0,   0,  -1,  -1},
    {  -1,  -1,   0,   0},
    {   0,  -1,  -1,   0},
    {   1,   0,  -1,   0},
    {   0,   1,   0,  -1},
    {  -1,   0,   1,   0},
    {   0,   0,   1,   1},
    {   1,   0,   1,   0},
    {   0,  -1,   0,   1},
    {   0,   1,   1,   0},
    {   0,   1,   0,   1},
    {  -1,   0,  -1,   0},
    {   1,   0,   0,   1},
    {  -1,   0,   0,  -1},
    {   1,   0,   0,  -1},
    {  -1,   0,   0,   1},
    {   0,  -1,   0,  -1}
};

我尝试将代码和括号更改为 warning: narrowing conversion C++11 后面的括号,但我仍然遇到同样的错误。有没有不回退到旧 C++ 标准的解决方案?

【问题讨论】:

  • 你能把结构改成signed char x, y, v, w;吗?
  • 与其他整数类型不同,char 是有符号还是无符号是未指定的。

标签: c++ c++11 narrowing


【解决方案1】:

要覆盖编译器,你必须写static_cast<char>(-1)

有些事情已经不能被新的 C++ 标准所接受,所以你必须找到一种更现代的方式来做事......

【讨论】:

  • constexpr char XX = static_cast<char>(-1); 然后将表格中的所有-1 替换为XX 可能会更清晰,并更好地保留表格的列格式。
  • 是否可以只更改 struct 中的 char 类型,或者我必须将 signed char 强制转换为 -1 only?
  • @Eljay:我当然会这样做。这也将摆脱幻数 -1 并给它一个更有意义的名字!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多