C++ -&燃气轮机;智能指针的用法

C++ -&燃气轮机;智能指针的用法,c++,pointers,smart-pointers,dereference,C++,Pointers,Smart Pointers,Dereference,我有一个简单的智能指针实现,如下面的代码片段1所示。在第二个代码段中,还有一个名为dummy的虚拟测试类。代码片段3展示了如何利用这个简单的智能指针访问函数foo() 我的问题是关于在类Dummy中使用->运算符调用函数foo()的方式。->运算符已返回指向原始指针的指针。因此,我认为,为了能够调用函数foo(),我们需要对返回的原始指针执行第二个->操作。然而,许多参考资料都说,只需使用->操作符就足够了 简而言之,我认为正确的呼叫应该如下所示: (虚拟->)->foo() 但是,类似于dum

我有一个简单的智能指针实现,如下面的代码片段1所示。在第二个代码段中,还有一个名为dummy的虚拟测试类。代码片段3展示了如何利用这个简单的智能指针访问函数foo()

我的问题是关于在类Dummy中使用->运算符调用函数foo()的方式。->运算符已返回指向原始指针的指针。因此,我认为,为了能够调用函数foo(),我们需要对返回的原始指针执行第二个->操作。然而,许多参考资料都说,只需使用->操作符就足够了

简而言之,我认为正确的呼叫应该如下所示: (虚拟->)->foo()

但是,类似于dummy->foo()的调用可以正常工作。有人能解释一下为什么(dummy->)->foo()不正确吗?也许,我有一个概念上的误解,但我想知道的概念是正确的

代码片段1(智能指针类)

代码片段3(有问题的发票替代方案)

SmartPointer虚拟对象(新虚拟对象());
(虚拟->)->func();
//我认为以上是正确的,因为我们需要对
//返回的原始指针
//或
dummy->func();

这是因为标准上这么说

对于类,表达式x->m被解释为(x.operator->())->m 如果存在T::运算符->(),并且运算符为 通过重载分辨率选择为最佳匹配函数 机制


这是因为标准上这么说

对于类,表达式x->m被解释为(x.operator->())->m 如果存在T::运算符->(),并且运算符为 通过重载分辨率选择为最佳匹配函数 机制

这样想:

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

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

这样想:

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


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

注意
a->b
被定义为
(*a)。b
(对于非重载的
->
),因此
(dummy->)func()
将被定义为
(*((*dummy)。.func()
这是无意义的。注意
a->b
被定义为
(*a)。b
(对于非重载的
->
),因此
(dummy->)->func()
将被定义为
(*dummy)。.func()
,这是无意义的。
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; }

};
class Dummy
{
 public:
   foo() {......}
};
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();