La regla que foo->bar
es igual (*foo).bar
solo es válida para los operadores incorporados.
Unary operator *
no siempre tiene la semántica de desreferencia de puntero. Podría hacer una biblioteca en la que signifique transposición de matriz, coincidencias de analizador cero o más, o casi cualquier cosa.
Haría que el lenguaje fuera más molesto si algo que se sobrecargara de operator *
repente ganara algo que operator ->
usted no solicitó, con una semántica que podría no tener sentido.
operator ->
se puede cargar por separado, por lo que si desea uno, puede sobrecargar uno con el mínimo esfuerzo.
También tenga en cuenta que dicha sobrecarga tendría algunas propiedades bastante interesantes, como el encadenamiento automático de operator ->
llamadas hasta que uno en la cadena devuelva un puntero sin formato. Esto es bastante útil para punteros inteligentes y otros 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;
}