Zasada, która foo->barjest równa, (*foo).bardotyczy tylko wbudowanych operatorów.
Unary operator *nie zawsze ma semantykę dereferencji wskaźnika. Mógłbym stworzyć bibliotekę, w której oznacza to transpozycję macierzy, zero lub więcej dopasowań parsera lub cokolwiek innego.
Sprawiłoby to, że język byłby bardziej kłopotliwy, gdyby coś, co przeciąża jednoargumentowo operator *, nagle zyskałoby coś, o operator ->co nie prosiłeś, z semantyką, która może nie mieć sensu.
operator -> jest osobno przeciążalny, więc jeśli chcesz, możesz przeciążyć jeden przy minimalnym wysiłku.
Zauważ też, że takie przeciążenie miałoby pewne dość interesujące właściwości, takie jak automatyczne łączenie operator ->wywołań, dopóki jeden w łańcuchu nie zwróci surowego wskaźnika. Jest to bardzo przydatne w przypadku inteligentnych wskaźników i innych typów proxy.
#include <boost/make_shared.hpp>
#include <boost/shared_ptr.hpp>
#include <string>
#include <iostream>
#include <ostream>
struct Foo
{
boost::shared_ptr<std::string> operator -> () const
{
return boost::make_shared<std::string>("trololo");
}
};
int main()
{
Foo foo;
std::cerr << foo->size() << std::endl;
}