歴史: オーバーロードできる理由 -> ではなく . オペレーター?どちらもメンバーアクセス演算子であり、同じ意味を持ちます。
私はいくつかの参照を読みました
http://www.stroustrup.com/bs_faq2.html#overload-dot
と
operator-> を手動でオーバーロードできるのはなぜですか?
しかし、-> ではなく .operator をオーバーロードできるのはなぜでしょうか?
-> 演算子が暗黙的に戻りポインターの参照を取得し、チェーン呼び出しとして呼び出しを行うためですか
struct X {
int foo;
};
struct Y {
X x;
X* operator->() { return &x; }
};
struct Z {
Y y;
Y& operator->() { return y; }
};
Z z;
z->foo = 42; // Works!
z->foo = 42; この呼び出しは ((z.operator()).opeartor()).operator() に変換されるため、foo の値は 42 に設定されます。
質問:- この点を取ると、まだ 2 つの点があります。
1) .(ドット) 演算子がこのように機能しないのはなぜですか?
2) -> 演算子がクラス Y への参照を返さない場合はどうなりますか? その場合、コンパイルエラーになりますか?