首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ static_cast -更安全的方式。为什么?

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

Stack Overflow用户
提问于 2014-05-05 15:51:18
回答 2查看 1.4K关注 0票数 2

我听说静态铸造是一种更安全的铸造方法。

让我们说,我有以下代码:

代码语言:javascript
复制
int nValue = 48;
char ch = nValue;

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

代码语言:javascript
复制
int nValue = 48;
char ch = static_cast<char>(nValue);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-05 16:02:28

static_cast并不比隐式转换更安全。但是,您可能已经读到static_cast比C强制转换更安全。那是因为它只允许“合理”的投射。合理转换的一些示例是数值类型之间、指向其他指针的void *、基类ptr到派生类ptr之间。例如:

代码语言:javascript
复制
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仍然可以允许糟糕的转换,但不是“不合理的”转换:

代码语言:javascript
复制
class D2 : public Base {};
...
Base *b = new D2;
D1 *p3 = static_cast<D1 *>(b); // Wrong, but allowed by compiler.
票数 11
EN

Stack Overflow用户

发布于 2014-05-05 16:22:50

在这种情况下,我准备建议static_cast本身并不安全。强制转换有效地告诉编译器,假设结果将适合char,并且不可能警告您数据截断。如果省略强制转换,编译器可以随时警告(特别是如果您请求)可能会丢失数据。

与您的问题无关,但当然是相关的,static_castreinterpret_cast和C风格的转换都安全,因为它能够执行的合法转换要有限得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23476673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档