-> 在智能指针中的使用

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-&gt;b 被定义为(*a).b(对于非重载-&gt;),所以(dummy-&gt;)-&gt;func() 将被定义为(*((*dummy).)).func() 这是废话。 【参考方案1】:

它就是这样,因为标准是这样说的......

一个表达式 x->m 被解释为一个类的 (x.operator->())->m 如果 T::operator->() 存在并且操作符是 T 类型的对象 x 被重载决议选为最佳匹配函数 机制

【讨论】:

【参考方案2】:

这样想:

dummy-&gt; 实际上返回 Dummy*。该标准允许在重载 operator->() 时,单个箭头足以推断 1) 重载的运算符和 2) 底层原始指针。

如果没有这种机制,我们就无法真正拥有“智能”指针,因为它与原始指针之间的语法会有所不同。

【讨论】:

以上是关于-> 在智能指针中的使用的主要内容,如果未能解决你的问题,请参考以下文章

c++中的智能指针

为什么要有智能指针

智能指针11

智能指针11

智能指针11

十智能指针二