La delegazione rvalue o l'equivalente rvalue di una funzione di membro cost
Domanda
struct that
{
that &frob()
{
return *this;
}
that frob() const
{
return that(*this);
}
//that &&frob() && //<-called only if *this is an rvalue
//{
// return move(*this);
//}
that()
{
// make things
}
that(const that &other)
{
// copy things
}
that(that &&other)
{
// move things
}
};
.
Ovviamente la funzione nei commenti sopra non è legale C ++, ma devo sapere se c'è un modo per realizzare questo:
that().frob().frob().frob();
.
E così via, mentre ogni chiamata a frob()
chiamerebbe efficacemente la versione "Sposta".Poiché questo è qualcosa che può essere determinato a tempo di compilazione, non riesco a pensare a nessun motivo per non esistere in qualche forma.
Posso scrivere qualcosa del genere:
that &&frob(that &&t)
{
return t;
}
.
che comporterebbe questo:
frob(frob(frob(that())));
.
che è in qualche modo fastidioso da leggere e non realizza il mio obiettivo di "spelling cose fuori" con la delegazione.
Soluzione
Se si desidera che la funzione annotata di &&
sia suonare bene con gli altri, è necessario utilizzare l'annotazione &
sugli altri.
that &frob() &
{
return *this;
}
that frob() const &
{
return that(*this);
}
. Altri suggerimenti
No, non c'è modo di determinare se un oggetto è un rvalue dall'interno dell'oggetto.Il meglio che puoi fare è copiarlo se è const
e spostalo se non è:
that frob() const
{
return *this;
}
that frob()
{
return std::move(*this);
}
.
Modifica
ulteriormente Reserch mostra che in realtà può , come sottolineato @potatoswatter, ma è chiamato definito e non annotazione.