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

use*_*928 1 c++ static-cast

我听说静电铸造是一种更安全的铸造方式.

可以说我有以下代码:

int nValue = 48;
char ch = nValue;
Run Code Online (Sandbox Code Playgroud)

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

int nValue = 48;
char ch = static_cast<char>(nValue);
Run Code Online (Sandbox Code Playgroud)

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

kec*_*kec 8

A static_cast不比隐式转换更安全.但是,你可能已经读过a static_cast比C cast更安全.那是因为它只允许"合理"的演员阵容.合理转换的一些示例将在数字类型之间,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.
Run Code Online (Sandbox Code Playgroud)

请注意,static_cast仍然可以允许糟糕的演员阵容,而不是"不合理"的演员阵容:

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