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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top