Как работает operator->?
Для указателя ptr->member
является сокращением для (*ptr).member
.
Если оператор-> перегрузка для возврата класса указатель на объект, тогда class_object->member
эквивалентен pointer_returned_by_the_operator->member
, что эквивалентно (*pointer_returned_by_the_operator).member
согласно эквивалентности в предыдущем абзаце.
Помимо указателя, перегрузка оператора-> для класса может вернуть другой объект класса, который перегружает operator->. В таком случае operator-> применяется рекурсивно до тех пор, пока перегрузка не вернет указатель, и в этом случае применяется предыдущий абзац.
Перегрузки для унарного оператора * и operator-> разделены, но пока оператор -> возвращает указатель на тот же объект, на который оператор * возвращает ссылку, тогда та же поведенческая эквивалентность сохраняется между class_object->member
и (*class_object).member
- хотя они будут вызывать отдельные перегрузки операторов.
В вашем конкретном случае b->c
эквивалентно b.a->c
(где b.a
вызывается в функции-члене), потому что перегруженный оператор возвращает указатель на this->a
.
Это уникальное поведение только для оператора >?
Да.