El operador flecha no tiene entradas. Técnicamente, puede devolver lo que quieras, pero debería devolver algo que sea un puntero o bien un puntero through chained ->
operators.
El operador ->
desreferencias automáticamente su valor de retorno antes de llamar a su argumento utilizando el incorporado en referencia a un puntero, no operator*
, lo que podría tener la clase siguiente:
class PointerToString
{
string a;
public:
class PtPtS
{
public:
PtPtS(PointerToString &s) : r(s) {}
string* operator->()
{
std::cout << "indirect arrow";
return &*r;
}
private:
PointerToString &r;
};
PointerToString(const string &s) : a(s) {}
PtPts operator->() const
{
std::cout << "arrow dereference\n";
return *this;
}
string &operator*() const
{
std::cout << "dereference\n";
return a;
}
};
usarlo como:
PointerToString ptr(string("hello"));
string::size_type size = ptr->size();
que es convertida por el compilador en:
string::size_type size = (*ptr.operator->().operator->()).size();
(con el mayor número .operator->()
como sea necesario para devolver un puntero real) y debe de salida
arrow dereference
indirect dereference
dereference
Nótese, sin embargo, que usted puede hacer lo siguiente:
PointerToString::PtPtS ptr2 = ptr.operator->();
De Stroupstrup:
La transformación del objeto p en el puntero p.operator->()
no depende del miembro m apuntado a. Ese es el sentido en el que operator->()
es un operador de un solo sufijo. Sin embargo, no se ha introducido una nueva sintaxis, por lo que aún se requiere un nombre de miembro después de ->
sin entradas. El tipo de devolución debe ser un puntero. Esto generalmente se usa para crear punteros "inteligentes", por lo que devuelve un puntero al objeto envuelto. – Tim