我听说静态演员是一种更安全的演员方式。
让我们说我有以下代码:
int nValue = 48;
char ch = nValue;
这是隐式投射。但是将4个字节更改为1个字节是不安全的。如果我将此代码更改为:
int nValue = 48;
char ch = static_cast<char>(nValue);
这会更安全。为什么?是什么让它更安全?它仍然将4个字节更改为1个字节。
答案 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风格的演员更安全,因为它的法律条款更为有限它可以执行的转换。