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! Calls both!
Я вспоминаю случай, когда такое поведение было необходимо, чтобы позволить объекту вести себя как прокси для другого объекта в контексте, подобном интеллектуальному указателю, хотя я не могу вспомнить детали. Что я помню, так это то, что я мог заставить поведение работать так, как я планировал, используя синтаксис a->b
, используя этот странный особый случай; Я не мог найти способ заставить (*a).b
работать аналогично.
Не уверен, что это отвечает на ваш вопрос; на самом деле я говорю: «Хороший вопрос, но это даже страннее!»