很少有人怀疑在C++中使用运算符

Alo*_*ave 6 c++ casting operator-overloading

reinterpret_cast我们知道可以将任何指针类型到另一个任何指针类型.关于这个演员运算符我想问的问题是:

  1. 如何reinterpret_cast工作,允许reinterpret_cast工作的魔力(内部实现)是什么?
  2. 使用时如何确保安全reinterpret_cast?据我所知,它不保证安全铸造,所以在使用时要采取什么预防措施reinterpret_cast?
  3. 这个运算符的实际用法是什么?我没有在我的专业编程经验中遇到过这种情况,其中我无法使用此运算符.除了通常的int*to char*之外的任何实际示例将非常有帮助和赞赏.

另外一个关于普通铸造运营问题:
铸造运营商(static_cast,dynamic_cast,const_cast,reinterpret_cast),都称为Operators即是最好的我的理解,因此,它是正确的说法,以使该casting operators cannot be overloaded unlike most other operators(我知道不是所有的运算符可以重载,我知道其中不可能(除了问我,请不要惹恼我)我怀疑这是因为他们是运营商,标准对这些有什么看法?

Jer*_*fin 5

  1. 没有魔法。reinterpret_cast通常只是意味着(至少尝试)将您在该地址找到的内容视为我指定的类型。该标准对其功能的定义很少,因此它可能与此有所不同,但它很少(如果有的话)确实如此。
  2. 在某些情况下,您可以从受歧视的工会等组织中获得安全感。例如,如果您正在读取网络数据包,并且读得足够多,可以看到您收到的是 TCP 数据包,那么您可以(相当)安全地执行 from reinterpret_castto IPHdrTCPHdr或您碰巧使用过的任何名称)。不过,编译器不会(通常)做太多事情——任何安全性都取决于您来实现和强制执行。
  3. 我使用了 2) 中描述的代码来处理不同类型的网络数据包。

对于你的最后一个问题:你可以重载一个类的转换:

class XXX { 
public:
    operator YYY() { return whatever; }
};
Run Code Online (Sandbox Code Playgroud)

不过,这通常可用于一般转换——无论是通过 static_cast、C 风格转换还是隐式转换来完成。C++0x 允许您添加explicit限定符,因此它不会用于隐式转换,但仍然无法区分 static_cast 和 C 风格的强制转换。

  • 我不明白最后一句话:“*没有办法区分 static_cast 和 C 风格的强制转换*”。问题是,C 风格的强制转换可以是“static_cast”或“reinterpret_cast”(可能包括“const_cast”)。在“static_cast”有效的所有情况下,C 风格的强制转换将执行“static_cast”,而当不可能时,它将执行“reinterpret_cast”。如果const-ness(或易失性)被修改,那么它将在进程中包含一个“const_cast”。 (2认同)
  • @Als:实际上它们是“转换函数”(根据§12.3.2/1),并不是说差异很重要。C++03 有“显式”,但仅适用于构造函数,不适用于转换函数。转换函数是所有可用的——对于其他任何东西,答案都是“不”。 (2认同)