Sono valori di ritorno sta per essere passati per riferimento rvalue in C ++ 0x?
-
19-09-2019 - |
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.
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.