智能指针的其他几个问题(1/2)

1.Address-Of操作(取址) 

我们可以使用指向指针的指针,这需要对指针取址,我们很容易把同样的想法加在智能指针上,但是,使用智能指针的目的是管理指针,直接暴露给外界底层的指针一定不是什么好事,而且,定义了取址操作的类型几乎不可能被使用于范型编程。

从这个意义上来说,远离Address-Of操作是个不错的选择。

2.隐式转换(Implicit Conversion)至原始指针

被传递的隐式转换的指针同样超出了智能指针的管理范围,不可预料的事情一样可能发生。而且,一个极端的情况是用户delete智能指针操作的时候,因为隐式转换的存在,在智能指针管理范围之外已经被删除了指针,这是和设计使用智能指针的初衷背道而驰的。

仅仅为了避免delete,可以定义void*的转换,造成delete歧义。但是,这个问题的更好解决方案是使用显示方法获取底层指针(显示转换)。这样做的好处是,你要做超出智能指针管理权限的事情,但是,白纸黑字,你的代码保证这是你可以如此做的。

隐式转换和显示转换的历史也告诉我们,显示要安全一些。

3.相等性(Equality)和不等性(Inequality)

为了支持相等性和不等性的测试,传递成为底层指针的测试是个不错的想法,但是这样有各种各样的问题,暴力定义各个操作是个不错的选择,尽管复杂烦琐,但是这保证了程序正确的行为,这是值得的,而且我们还有template技术的支持,不会有太多的代码,试想一下LOKI_TYPELIST_50你就知道你没做多少工作了。

对每种判断情况定义判断操作函数,friend化保证可以访问到底层数据,是实现这些方法的手段。唯一一个无法解决的问题是if(sp)...测试,但是你可以使用if(!!sp)...替代。可以有手段支持到if(sp)...,但是不安全。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值