可以在内置类型中使用C风格的强制转换吗?

jac*_*hab 17 c++ casting

在这里阅读了很多关于C++ C++风格的答案后,我还有一个小问题.我是否可以将C风格的铸件用于内置类型,long x=(long)y;或者它仍然被认为是坏的和危险的?

Kon*_*lph 28

我可以将C样式转换用于内置类型,例如long x =(long)y; 或者它仍然被认为是坏的和危险的?

永远不要使用它们.反对使用它们的原因也适用于此.基本上,一旦你使用它们,所有的赌注都会关闭,因为编译器不会再帮你了.虽然这是指针比其他类型更危险,它可能仍然危险和错误的情况下,给出了不高的编译诊断,而新风格的转换提供了更丰富的错误消息,因为它们的使用更加受约束:迈尔斯引用虚掷的例子const岬:使用任何投以外const_cast不会编译,从而使其清楚什么在这里发生.

此外,无论类型如何,其他一些缺点也适用,即语法考虑因素:C风格的演员表非常不引人注目.这并不好:C++强制转换在代码中很明显,并指向潜在危险的代码.它们也可以在IDE和文本编辑器中轻松搜索.尝试在大型代码中搜索C风格的演员表,你会发现它有多难.

另一方面,C风格的演员表没有优于C++演员阵容的优势,所以甚至没有考虑的权衡.

更一般地说,斯科特迈耶斯建议在"有效C++"(第27项)中"尽量减少演员阵容",因为"演员表颠覆了类型系统".

  • 那么,在那种非常具体的情况下,甚至不需要演员,因为double是一个比float更大的类型. (3认同)

Joh*_*McG 17

我不会,原因如下:

  • 演员很丑陋,应该是丑陋的,在你的代码中脱颖而出,并且可以使用grep和类似的工具找到它们.
  • "总是使用C++强制转换"是一个简单的规则,比"用户定义的类型使用C++强制转换"更容易被记住和遵循,但在内置类型上使用C风格的强制转换是可以的.
  • C++样式转换为其他开发人员提供了有关为什么需要强制转换的更多信息.
  • C风格的强制转换可以让你做你不想要的转换 - 如果你有一个接口(int*)并且你使用c风格的强制转换来传递一个const int*,并且界面改为在很长的*中,使用c风格的演员表的代码将继续工作,即使它不是你想要的.

  • 我不相信任何这些原因(除了*可以说是*第一个)都适用于数字类型*中的强制转换*; 看到我的回答. (2认同)

zwo*_*wol 8

如果您是铸造数字型,另一个数字类型,那么我认为C风格的转换都是最好*_cast.每个*_cast运算符都有一个特定的理由不在数字类型上使用它:

  • reinterpret_cast当应用于数字类型时,执行正常的数字转换而不是重新解释位,即写入reinterpret_cast<uint64_t>(3.14159) 不会产生具有与浮点常量相同的位表示的整数.这与直觉相反.
  • const_cast是从未上的数字必要,和如果施加到一个数字变量(而不是一个指针或引用的数字),表明该变量的类型不正确.
  • dynamic_cast just plain对数字没有意义,因为数字从不具有动态类型.
  • static_cast通常用于类类型.因此,申请数字看起来很奇怪static_cast ; 你的读者会抓挠他们的头脑,并想知道是否有一些他们不知道的事情static_cast,这使得它在应用于数字时与C风格的演员不同.(事实上​​,它们是相同的,但我必须阅读相关的C++规范部分几次,以确保它们是相同的,并且我仍然有"一些奇怪的东西必须在这里"反应.)

并且有一个额外的风格理由来避免它们:

  • 如果需要在数字类型中进行转换,则可能需要在集群中执行其中的几个; 因此,C风格演员的简洁很重要.例如,我正在编写的程序现在有很多这样的东西:

    uint32_t n = ((uint32_t(buf[0]) << 24) |
                  (uint32_t(buf[1]) << 16) |
                  (uint32_t(buf[2]) <<  8) |
                  (uint32_t(buf[3])      ));
    
    Run Code Online (Sandbox Code Playgroud)

    static_cast在这里使用会模糊算术,这是重要的事情.(注意:这些演员阵容只有在现在sizeof(uint32_t) <= sizeof(unsigned int)一个安全的假设时才是不必要的,但我仍然更喜欢明确性.)(是的,我可能应该将此操作分解为be32_to_cpu内联助手,但我仍然以相同的方式编码.)

  • @PeterSW我的推荐仅适用于*源*和目标都是上下文中明确的数字类型.如果有可能涉及的指针,我同意新式的转换操作符更安全. (3认同)
  • @PeterSW C样式强制转换与`static_cast`*相同,用于数值类型*之间的转换. (2认同)
  • *“`static_cast` 通常用于类类型。因此,将 `static_cast` 应用于数字看起来很奇怪;”* 这听起来像是个人的期望,并且似乎没有任何事实依据。 (2认同)