【问题标题】:narrowing conversion on struct initialization缩小结构初始化的转换
【发布时间】:2018-09-28 12:31:33
【问题描述】:
struct st {
    unsigned short a;
    unsigned short b;
};

int main(){
    unsigned short a(10), b(10);

    st{ a + b, a - b };

    return 0;
}

初始化列表行出错:

错误 C2397:从“int”转换为“unsigned short”需要 缩小转化率

所以我相信已经隐式转换为“int”。我没有要求它。我该怎么做才能防止它发生?

int main(){
  unsigned short a(10), b(10), c;

  c = a + b;

  return 0;
}

这段代码编译得很好

【问题讨论】:

  • 不幸的是,您无意中掉入了算术运算符使用的int 之外的陷阱。如果大小不是限制,我建议您为您的成员使用 unsigned int 或更大的类型。
  • 可以考虑沿st(unsigned short x,unsigned short y) : a(x+y),b(x-y) {}这一行添加一个构造函数
  • @user463035818 我猜发布的代码只是为了展示一个更一般的构造函数示例,即使用临时调用的构造函数(顺便说一下,OP 可以定义)。

标签: c++


【解决方案1】:

确实a + bint 类型,因为unsigned short 是更窄的类型。

尽管存在(定义的)溢出的可能性,但为了避免这种情况,您需要提供一个演员表:

st{ (unsigned short)(a + b), (unsigned short)(a - b) };

如果您想非常明确,请使用static_cast。如果你不喜欢重复你的类型(我就是这种类型),你可以写

st{ static_cast<decltype(st.a)>(a + b), static_cast<decltype(st.b)>(a - b) }

向您的类添加构造函数是另一种选择。

【讨论】:

  • 下一步是什么?添加两个浮点数会隐式转换为双精度数吗?说真的,这到底是怎么回事,伙计......
  • @user3600124:所有算术运算至少在int 处执行。这是我害怕的生活。
  • @user3600124 不,但是将 int(任意大小)添加到浮点数会将整数提升为浮点数。
  • 有几个构造函数选项:/(st(int, int)st(unsigned short, unsigned short))。一个允许使用 misleading 界面隐藏任何缩小。另一个并没有真正解决问题,因为st{ a + b, a - b } 仍然存在诊断,但允许使用st(a + b, a - b ) 调用...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
相关资源
最近更新 更多