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;
}
->
cadenas de operador hasta que obtiene un puntero sin formato a algo, desreferenciando y accediendo a un miembro de él. Si el operador -> no encadenara, el ejemplo estaría mal formado ya que shared_ptr no es un puntero sin formato.A->B
cadenas de sintaxis como máximo 1 llamada adicional. Lo que realmente hace la sintaxis binaria C ++ -> no es llamaropeartor->
directamente al objeto, sino que analiza el tipo deA
y comprueba si es un puntero sin formato. Si luego lo->
deja y ejecutaB
sobre eso, de lo contrario llama al objetooperator->
, deja de lado el resultado (ya sea usando un puntero en bruto nativo u otrooperator->
y luego se ejecutaB
sobre el resultadox->m
se interpretará como(x.operator->())->m
. Si el LHS es algo que tiene una sobrecarga adecuada deoperator->
nuevo, este proceso se repite hasta que se(*x).m
produce el efecto habitual de 5.2.5 / 2.