在这里阅读了很多关于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项)中"尽量减少演员阵容",因为"演员表颠覆了类型系统".
Joh*_*McG 17
我不会,原因如下:
如果您是铸造从数字型,到另一个数字类型,那么我认为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内联助手,但我仍然以相同的方式编码.)