C ++ static_cast - 更安全的方式。为什么?

时间:2014-05-05 15:51:18

标签: c++ static-cast

我听说静态演员是一种更安全的演员方式。

让我们说我有以下代码:

int nValue = 48;
char ch = nValue;

这是隐式投射。但是将4个字节更改为1个字节是不安全的。如果我将此代码更改为:

int nValue = 48;
char ch = static_cast<char>(nValue);

这会更安全。为什么?是什么让它更安全?它仍然将4个字节更改为1个字节。

2 个答案:

答案 0 :(得分:8)

static_cast并不比隐式转换更安全。但是,您可能已经读过static_cast比C演员更安全。这是因为它只允许“合理的”#34;管型。合理强制转换的一些示例将在数值类型之间,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仍然可以允许糟糕的演员阵容,而不是#34;不合理的&#34;的:

class D2 : public Base {};
...
Base *b = new D2;
D1 *p3 = static_cast<D1 *>(b); // Wrong, but allowed by compiler.

答案 1 :(得分:2)

在这种情况下,我准备建议static_cast 本身更安全。演员有效地做的是告诉编译器假设结果将适合char并且不可能警告您数据截断。如果省略演员表,编译器可以自由发出警告(特别是如果你提出请求),可能会丢失数据。

与您的问题无关,但肯定是相关的,static_cast reinterpret_cast和C风格的演员更安全,因为它的法律条款更为有限它可以执行的转换。