C++ でアロー演算子をオーバーロードした時の注意

以下の例だとオーバーロードしたアロー演算子は呼び出されません。

#include <iostream>

struct X{
    X*
    operator ->(){
        std::cout << "operator ->" << std::endl;
        return this;
    }

    void
    func(){
        std::cout << "func" << std::endl;
    }
};

int
main(){
    X* x = nullptr;
    x->func();
    return 0;
}
/*
output:
func
*/

これは、x が単なるポインタ型なので X の定義の影響を受けないからです。
正しくオーバーロードしたアロー演算子を呼び出したい場合は、

(*x)->func();

という風にする必要があります。

[参照]