[英]Is there any advantage in using static_cast rather than C-style casting for non-pointer types?
我很清楚使用static_cast
而不是C样式转换为指针类型的优势。
如果指针类型不兼容,则:
static_cast
将在源代码中的特定行产生编译时错误 但我无法找到非指针类型的任何类似示例。
换句话说,两种转换方法对非指针类型产生相同的结果。
这是正确的,还是我错过了什么?
如果是, static_cast
是否仅用于非指针类型以保持编码一致性?
其他两个答案尚未提及的一个优点是static_cast
更容易被发现。 圆括号的含义在C ++中是众所周知的超载,并且很难发现邪恶(甚至是不正确的)强制转换。 当我在_cast
看到一些结尾时,它就像一个心理速度颠簸:我放慢速度并仔细检查为什么类型系统被颠覆了。
我假设使用引用来避免指针的琐碎使用将不计算在内。
在这种情况下:C风格的演员阵容可以是:
const_cast
static_cast
static_cast
后跟const_cast
, reinterpret_cast
reinterpret_cast
然后是一个const_cast
除了static_cast
对不可访问的基类的限制被取消。
const_cast
仅适用于指针和引用。
reinterpret_cast
仅适用于指针和引用。 它确实包括指针到整数的转换,反之亦然,但仍然涉及指针类型。
static_cast
特殊异常仅适用于指针和引用。
所以,是的,通过排除指针和引用,您已经排除了C样式转换支持的所有内容,而不是static_cast
。
如果是,
static_cast
是否仅用于非指针类型以保持编码一致性?
让我们进行类比:我不会用电锯打开一袋芯片。 我可以,但链锯是危险的,所以通过使用一个,我会引入不必要的风险。 使用电锯非常容易错误,如果我使用错了,就没有安全机制来防止事故发生。
static_cast
是否仅用于非指针类型以保持编码一致性?
不仅如此,还有助于保持正确性和未来的兼容性。
它有助于保持正确性,因为static_cast
不能做一些C风格的演员阵容。 如果你对所涉及的某些类型犯了错误,或者在确信它是一个整数时处理一个指针(以及几层模板和typedef,这不是很难想象),这会有所帮助。 因此,如果您打算使用static_cast
,编写一个并获得编译时错误,您将立即被告知所涉及的类型不是您认为的类型。 随着C风格演员的“随时随地”的态度,你不会及时发现错误。
它还有助于未来的兼容性。 如果演员中涉及的类型在开发后期发生变化,则static_cast
将报告一个错误,其中C风格的演员表会默默地改变其行为(对于最不可能的事情)。
static_cast是否仅用于非指针类型以保持编码一致性?
不(嗯 - 是的,但不仅仅是)。
它也很容易找到/替换。 这在重构,错误修复等情况下很重要。
它是对允许的强制转换类型的约束:考虑一个示例,其中您对变量进行了C样式转换(可以正常工作),然后将转换变量的声明更改为呈现强制转换的内容(例如,你改变int x;
到void * const x;
)。
C风格的const_cast<...>(reinterpret_cast<...>(...)
使用相同的代码突然执行另一个函数(即const_cast<...>(reinterpret_cast<...>(...)
)。
如果使用static_cast而不是C样式转换编写初始代码,编译器会告诉您static_cast实际上没有执行静态转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.