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)...,但是不安全。