La regola che foo->bar
equivale a (*foo).bar
vale solo per gli operatori incorporati.
Unario operator *
non ha sempre la semantica della dereferenziazione puntatore. Potrei creare una libreria in cui significa trasposizione di matrici, zero o più corrispondenze di parser o praticamente niente.
Renderebbe il linguaggio più fastidioso se qualcosa che sovraccarichi unary operator *
improvvisamente guadagnerebbe un operator ->
che non hai richiesto, con una semantica che potrebbe non avere senso.
operator ->
è sovraccarico separatamente, quindi se ne vuoi uno, puoi sovraccaricarlo con uno sforzo minimo.
Si noti inoltre che un tale sovraccarico avrebbe alcune proprietà piuttosto interessanti, come il concatenamento automatico delle chiamate operator ->
finché uno nella catena non restituisce un puntatore raw. Questo è abbastanza utile per i puntatori intelligenti e altri tipi di 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;
}