Qualche tempo fa mi è stato detto che il solito schema per implementare gli operatori two-ary ha bisogno di un finale move
nel ritorno.L'operatore C++ 0x T + (const T &, T &&), ha ancora bisogno di muoversi?
Matrix operator+(const Matrix &a, Matrix &&b) {
b += a;
return std::move(b);
}
Ma ora v'è la regola speciale che in un return
il compilatore può trattare il valore di ritorno come temporanea, e poi questo non sarebbe necessario - un semplice return b
sarebbe sufficiente.
Ma poi di nuovo, b
ha un nome in questa funzione, quindi, il suo un Ivalue - che impedisce al compilatore di m ritiene che sia una temperatura, ed è richiesta l'move
.
E 'ancora il caso nella versione più recente dello standard C++ 0x? Abbiamo bisogno dello move
per implementare il modello sopra?
Secondo [questa risposta] (http://stackoverflow.com/questions/6009004/are-value-parameters-implicitly-moved-when -returned-by-value/6009012 # 6009012), 'std :: move' non è necessario. – fredoverflow
Anche se potrebbe fare la differenza che il parametro sia un 'Matrix &&' invece di un 'Matrix' ... – fredoverflow
È * complicato, sì. E sì, penso che tu abbia ragione. Se è un parametro * di valore * come 'Matrix', allora hai una copia vergine per te da solo - una temp. Il compilatore sa che puoi prenderlo. Con 'Matrix &&' Non sono * that * sure- – towi