-> 在智能指针中的使用
Posted
技术标签:
【中文标题】-> 在智能指针中的使用【英文标题】:-> usage in smart pointers 【发布时间】:2013-11-14 20:12:59 【问题描述】:我有一个简单的智能指针实现,如下面的代码 sn-p 1 所示。在第二个 sn-p 中有一个名为 Dummy 的虚拟测试类。代码 sn-p 3 展示了我们如何利用这个简单的智能指针来访问函数 foo()。
我的问题是关于我们在 Dummy 类中使用 -> 运算符调用函数 foo() 的方式。 -> 运算符已经返回一个指向原始指针的指针。所以,我认为,为了能够调用函数 foo(),我们需要对返回的原始指针执行第二次 -> 操作。但是,许多资源表明,单次使用 -> 运算符就足够了。
简而言之,我认为正确的调用应该如下所示: (dummy->)->foo();
但是,像这样的 dummy->foo() 调用可以正常工作。有人能解释一下为什么 (dummy->)->foo() 不正确吗?也许,我有一个概念上的误解,但我想知道正确的概念。
代码片段 1(智能指针类)
template <typename T>
class SmartPointer
private:
T* mRawPointer;
public:
SmartPointer(T* thePointer) : mRawPointer(thePointer)
~SmartPointer() delete mRawPointer;
T& operator* () const return *mRawPointer;
T* operator-> () const return mRawPointer;
;
代码片段 2(类虚拟)
class Dummy
public:
foo() ......
;
代码片段 3(有问题的调用替代方案)
SmartPointer<Dummy> dummy(new Dummy());
(dummy->)->func();
//I think the above is correct cause we need to make a second dereference on the
//returned raw pointer
//OR
dummy->func();
【问题讨论】:
注意a->b
被定义为(*a).b
(对于非重载->
),所以(dummy->)->func()
将被定义为(*((*dummy).)).func()
这是废话。
【参考方案1】:
它就是这样,因为标准是这样说的......
一个表达式 x->m 被解释为一个类的 (x.operator->())->m 如果 T::operator->() 存在并且操作符是 T 类型的对象 x 被重载决议选为最佳匹配函数 机制
【讨论】:
【参考方案2】:这样想:
dummy->
实际上返回 Dummy*
。该标准允许在重载 operator->() 时,单个箭头足以推断 1) 重载的运算符和 2) 底层原始指针。
如果没有这种机制,我们就无法真正拥有“智能”指针,因为它与原始指针之间的语法会有所不同。
【讨论】:
以上是关于-> 在智能指针中的使用的主要内容,如果未能解决你的问题,请参考以下文章