C++ 缩小结构初始化时的转换范围

C++ 缩小结构初始化时的转换范围,c++,C++,在初始化列表的行上发出错误: 错误C2397:从“int”转换为“unsigned short”需要 窄化转换 所以我相信隐式转换到int已经发生了。我没有要求。我该怎么做才能防止它发生 struct st { unsigned short a; unsigned short b; }; int main(){ unsigned short a(10), b(10); st{ a + b, a - b }; return 0; } 虽然a+b确实是

在初始化列表的行上发出错误:

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

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

struct st {
    unsigned short a;
    unsigned short b;
};

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

    st{ a + b, a - b };

    return 0;
}

虽然
a+b
确实是
int
类型,但是该代码编译得很好,因为
无符号短
是一种更窄的类型

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

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

  c = a + b;

  return 0;
}
如果你想非常明确,也可以使用
静态\u cast
。如果你不喜欢重复你的类型(我是这类人),你可以写

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

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

不幸的是,您陷入了这样一个陷阱:算术运算符使用的
int
是最小的。如果大小不是一个约束,我建议使用<代码>未签名的int 或更大类型的成员。可能考虑在<代码> ST(无符号短X,无符号短Y)的行中添加一个构造函数:a(x+y),b(X-y){}@user463035818我想发布的代码只是展示了一个更一般的例子,即使用临时函数调用构造函数(顺便提一下,OP可以定义临时函数)。接下来呢?添加两个float将隐式转换为double?说真的,见鬼,伙计…@user3600124:所有算术运算都至少在
int
上执行。恐怕这就是生活。@user3600124否,但将int(任何大小)添加到浮点会将整数提升为浮点。有几个构造函数选项:/(
st(int,int)
st(unsigned short,unsigned short)
)。一个允许隐藏任何带有误导性界面的变窄。另一个没有真正解决这个问题,因为仍然存在对
st{a+b,a-b}
的诊断,但允许使用
st(a+b,a-b)
调用。。。
st{ static_cast<decltype(st.a)>(a + b), static_cast<decltype(st.b)>(a - b) }