A regra foo->bar
igual a (*foo).bar
apenas é válida para os operadores internos.
O Unary operator *
nem sempre tem a semântica de desreferência de ponteiro. Eu poderia criar uma biblioteca na qual isso significa transposição de matriz, zero ou mais correspondências do analisador ou praticamente qualquer coisa.
Isso tornaria a linguagem mais incômoda se algo que sobrecarregasse o unário operator *
ganhasse de repente um que operator ->
você não pedisse, com semânticas que talvez não fizessem sentido.
operator ->
é sobrecarregável separadamente; portanto, se você quiser um, pode sobrecarregar um com o mínimo esforço.
Observe também que essa sobrecarga teria algumas propriedades bastante interessantes, como encadear operator ->
chamadas automaticamente até que uma na cadeia retorne um ponteiro bruto. Isso é bastante útil para ponteiros inteligentes e outros tipos de 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;
}