1

我试图实现一个类似于标准库 auto_ptr 的智能指针类,因此我不得不重载 -> 运算符。这是我的代码

template <typename T>
class SmartPtr
{

   T * operator -> ()
  {
    return _pAct;
  }

 private:
 T * _pAct;
};

其余的实现没有显示,以避免转移我的查询。

现在我创建一个 A 类的 SmartPtr 并在其上调用 A 中的 Show() 方法:

SmartPtr smPtr(new A);
smPtr->Show();

这是我的查询(不知道它是否也有效)

由于 SmartPtr::operator->() 返回 A*,因此对 show 的调用应转换为 (A*)Show。为什么它转换为 (A*)->Show() ?

或者换句话说, smPtr->Show() 如何在任何 smPtr->() 运算符返回时调用 Show() ?

4

1 回答 1

4

因为运算符->按顺序应用,直到不能再应用为止。

13.5.6 类成员访问 [over.ref]

1)operator->应该是一个不带参数的非静态成员函数。-> postfix-expression -> id-expression 它使用一个表达式x->m(x.operator->())->mxTT::operator->()来实现类成员访问,如果 存在并且如果运算符被重载决策机制(13.3)选择为最佳匹配函数,则表达式被解释为类型的类对象。(强调我的)

这意味着,在您的情况下,它转化为:

smPtr.operator->()->Show();
          |           |
      returns A*   call Show on the A*
于 2012-10-04T09:21:15.210 回答