我听说静态铸造是一种更安全的铸造方法。
让我们说,我有以下代码:
int nValue = 48;
char ch = nValue;这是隐式铸造。但是将4字节改为1字节是不安全的。如果我将此代码更改为:
int nValue = 48;
char ch = static_cast<char>(nValue);这样会更安全。为什么?是什么让它更安全?它仍在将4字节更改为1字节。
发布于 2014-05-05 16:02:28
static_cast并不比隐式转换更安全。但是,您可能已经读到static_cast比C强制转换更安全。那是因为它只允许“合理”的投射。合理转换的一些示例是数值类型之间、指向其他指针的void *、基类ptr到派生类ptr之间。例如:
class Base {};
class D1 : public Base {};
class D11 {};
...
Base *ptr_to_Base(...); // Get from somewhere.
D11 *p = (D11 *) ptr_to_Base; // No compiler error! I need new eyeglasses!
D11 *p2 = static_cast<D11 *>(ptr_to_Base); // This gives you a compiler error.请注意,static_cast仍然可以允许糟糕的转换,但不是“不合理的”转换:
class D2 : public Base {};
...
Base *b = new D2;
D1 *p3 = static_cast<D1 *>(b); // Wrong, but allowed by compiler.发布于 2014-05-05 16:22:50
在这种情况下,我准备建议static_cast本身并不安全。强制转换有效地告诉编译器,假设结果将适合char,并且不可能警告您数据截断。如果省略强制转换,编译器可以随时警告(特别是如果您请求)可能会丢失数据。
与您的问题无关,但当然是相关的,static_cast比reinterpret_cast和C风格的转换都安全,因为它能够执行的合法转换要有限得多。
https://stackoverflow.com/questions/23476673
复制相似问题