Domanda

Diciamo che ho una funzione:

typedef std::vector<int> VecType;
VecType randomVector();

int processing()
{
    VecType v = randomVector();
    return std::accumulate(v.begin(), v.end(), 0);
}

Il C ++ 0x dire specificamente la copia spuria sarà scongiurato dal valore di ritorno di randomVector? O sarebbe un compilatore necessario implementare RVO? Mi sembra come il randomVector() valore deve essere trattato come un rvalue, e, quindi, il costruttore mossa di v dovrebbe essere chiamato, ma non sono del tutto sicuro che questo è vero.

È stato utile?

Soluzione

La regola è la seguente

  • Se il compilatore può fare RVO, allora è permesso di farlo, e nessuna copia e nessuna mossa è fatta.
  • In caso contrario, viene presa la costruttore appropriato.

Come si dice, la temporanea è un rvalue, e quindi si seleziona il costruttore movimento, a causa di una regola in 13.3.3.2/3, che dice che un riferimento rvalue si lega a un rvalue meglio di un riferimento lvalue. Nel decidere se utilizzare il movimento o il costruttore di copia, la risoluzione di sovraccarico Perciò preferisce il costruttore mossa.

La regola che il compilatore può eseguire RVO è scritto in 12.8/15.

Altri suggerimenti

Tutti i valori di ritorno si considerano rvalues quindi se il compilatore non implementa RVO in questo caso si deve utilizzare il costruttore mossa piuttosto che il costruttore di copia.

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