ここをキャンプ地とするブログ

いきあたりばったり

operator->覚え書き

Modern C++ Design―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術 (C++ In‐Depth Series)

に書いてあったけど、

ユーザ定義のoperator->を適用した後、その結果に対してもう一度operator->を適用するのです。コンパイラは、こういったことを組み込み型へのポインタに到達するまで再帰的に行い、そのメンバのアクセスへと進むのです。

だって。

要は生のポインタが返ってくるまで、operator->を呼び続けるらしい。

ちょっとやってみた。

#include <cstdio>

class Hoge
{
  public:
    void Func(){ printf("Hoge's Func()\n"); }
};

class Fuga
{
    Hoge hoge_;

  public:
    void Func(){ printf("Fuga's Func()\n"); }
    Hoge* operator->(){ return  }
};

class Ref
{
    Fuga fuga_;

  public:
    Fuga& operator->(){ return fuga_; }
};

class Ptr
{
    Fuga fuga_;

  public:
    Fuga* operator->(){ return  }
};


int main()
{
    Ref ref;
    Ptr ptr;

    ref->Func();
    ptr->Func();
}

出力は、

Hoge's Func()

Fuga's Func()

へー。


よくよく考えれば、オーバーロードしたoperator->の返り値にもう一度oeprator->を適用しないと、普通にポインタ返したときすら意味不明になっちゃう気がする。


ptr->Func();
^^^^^
ここだけ処理するイメージ

(ptr->)Func();
↓
(&fuga_)Func();  なにこれ?

みたいな。

なるほどなー。


しかし、自前でスマートポインタかなんか作らないかぎり使いどころの無さそうな知識だ・・・。