C++ 重载 ->运算符,它是如何工作的?

C++ Overloading -> operator, how does it work?

本文关键字:何工作 工作 重载 gt 运算符 C++      更新时间:2023-10-16

我试图实现一个类似于标准库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() 上如何?

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

13.5.6 类成员访问 [over.ref]

1) operator->应为非静态成员函数,不采取 参数。它使用 -> postfix-expression -> id-expression 解释表达式x->m实现类成员访问 作为类对象的(x.operator->())->mx类型为 T 如果 T::operator->()存在,如果运算符被选为最佳运算符 通过过载解决机制 (13.3) 实现匹配功能。(强调我的)

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

smPtr.operator->()->Show();
          |           |
      returns A*   call Show on the A*