The reinterpret_cast
正如我们所知,可以将任何指针类型转换为任何其他指针类型。关于这个强制转换运算符我想问的问题是:
- 如何
reinterpret_cast
工作,允许reinterpret_cast工作的魔法(内部实现)是什么?
- 使用时如何保证安全
reinterpret_cast
?据我所知,它并不能保证安全铸造,那么使用时需要注意什么reinterpret_cast?
- 这个运算符的实际用途是什么?在我的专业编程经验中,我还没有真正遇到过它,如果不使用这个运算符,我就无法绕过它。除了通常的 int* 到 char* 之外的任何实际示例都将非常有帮助和赞赏。
关于一般铸造操作员的另一个问题:
铸造操作员(static_cast
, dynamic_cast
, const_cast
, reinterpret_cast
) 都被称为Operators
据我所知,这样的说法是否正确casting operators cannot be overloaded unlike most other operators
(我知道并非所有操作符都可以重载,我也知道哪些操作符不能重载(除了我要问的问题,请不要对此发火)只是我有这样的疑问,既然他们是操作符,那么标准是怎么说的关于这些?
- 没有魔法。
reinterpret_cast
通常只是意味着(至少尝试)将您在该地址找到的内容视为我指定的类型。该标准对其用途的定义还不够多,因此它could与此不同,但很少(如果有的话)确实如此。
- 在某些情况下,您可以从受歧视的工会等组织中获得安全感。例如,如果您正在读取网络数据包,并且读得足够多,可以看到您收到的是 TCP 数据包,那么您可以(相当)安全地执行
reinterpret_cast
from IPHdr
to TCPHdr
(或者您碰巧使用过的任何名称)。不过,编译器不会(通常)做太多事情——任何安全性都取决于您来实现和强制执行。
- 我使用了 2) 中描述的代码来处理不同类型的网络数据包。
对于你的最后一个问题:你可以重载一个类的转换:
class XXX {
public:
operator YYY() { return whatever; }
};
不过,这通常可用于一般转换——无论是通过 static_cast、C 风格转换还是隐式转换来完成。 C++0x 允许您添加explicit
限定符,因此它不会用于隐式转换,但仍然无法区分 static_cast 和 C 风格的强制转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)