在static_cast中包装类型转换是否会受到伤害?

时间:2016-02-22 23:05:09

标签: c++ visual-studio

我正在更新一些旧代码,我在Visual Studio中遇到了warning C4244: '+=': conversion from 'std::streamsize' to 'unsigned long', possible loss of data的数百条警告。

项目在忽略警告时编译并运行正常,但我想删除它们并在每个项目周围放置一个static_cast<unsigned long>()函数。考虑到代码现在运行良好,这可能有害吗?

3 个答案:

答案 0 :(得分:3)

是的,static_cast可能会受到伤害,因为它会告诉编译器关闭,因为你知道你在做什么。问题是你是否真的知道你在做什么?

显然,如果存储的数据超过较小的类型大小,则转换为较小的类型会导致意外的结果。如果您确切知道,请使用static_cast,这种情况不会发生,或者您希望截断值。如果没有,请保持警告,直到您正确设计代码为止。

答案 1 :(得分:2)

  

当忽略警告

时,项目编译并运行正常

首先,永远不要忽略警告。想一想你的代码实际上做了什么。

  

考虑到代码现在运行良好,这可能有害吗?

对于您的具体情况,来自static_cast<unsigned long>的{​​{1}}会有害。

正如std::streamsize的参考文档所述,它故意为std::streamsize类型:

  
    

类型signed签名整数类型,用于表示在I / O操作中传输的字符数或I / O缓冲区的大小。它用作std::streamsize签名对应项,类似于POSIX类型std::size_t

  

在这种情况下静态转换实际上意味着语义的丢失

答案 2 :(得分:0)

  

这个想法是static_cast允许的转换次数要少一些   可能导致错误而不是需要reinterpret_cast的错误。在   原则上,可以不使用static_cast的结果   将它转换回原来的类型,而你应该总是施放   之前reinterpret_cast回到原始类型的结果   使用它来确保可移植性。

来自Bjarne Stroustrup's C++ Style and Technique FAQ

小心const s。 static_cast不会抛弃const

总的来说,我认为最好重写代码而不是“抛弃每一个问题”,希望一切顺利。