如何处理const和非const花式指针之间的隐式和显式类型转换?

时间:2018-01-13 14:17:48

标签: c++ casting const const-cast fancy-pointers

给出类型定义

using ConstHandle = MyEntity const*;
using Handle = MyEntity*;

可以进行以下类型转换:

  1. HandleConstHandle(隐含)
  2. ConstHandleHandle(通过const_cast明确表示)
  3. Handle*ConstHandle*(通过const_cast明确表示)
  4. ConstHandle&Handle&(通过const_cast明确表示)
  5. 我可以使用基于ID而不是指针的句柄实现类似的行为吗?

    案例1和案例2可以很容易地解决,例如

    struct ConstHandle
    {
       int id;
    };
    
    struct Handle
    {
       operator ConstHandle() const { return { id }; }
       int id;
    };
    
    Handle const_handle_cast(ConstHandle h) { return { h.id }; }
    

    案例3可以通过从Handle派生ConstHandle来解决几乎,即

    struct ConstHandle
    {
       int id;
    };
    
    struct Handle : ConstHandle
    {
    };
    

    此处,几乎指的是,现在,转化Handle*ConstHandle*是隐含的而非显式的。

    是否有包含案例4的合法解决方案? 法律特别指的是暗示的方法违反严格别名规则

0 个答案:

没有答案