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 式は、存在する場合、およびオーバーロード解決メカニズム (13.3) によって最適一致関数として演算子が選択された場合、型 のクラス オブジェクトx->mとして解釈され(x.operator->())->mxTT::operator->()ます。(私のものを強調)

つまり、あなたの場合、次のように変換されます。

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