在结构初始化时缩小转换范围

时间:2018-09-28 12:31:33

标签: c++

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;
}

尽管此代码编译良好

1 个答案:

答案 0 :(得分:5)

实际上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) }

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