2016-06-30 4 views
0

J'utilise cette classe, pas écrit par moi et je ne peux pas changer son code:Déplacer dans une fonction qui prend référence const lvalue

class A { 
private: 
    Val d_val; 
public: 
    void setVal(const Val& val) { d_val = val; } 
    const Val& getVal() const { return d_val; } 
}; 

Val soutient la proposition mais la classe A a été écrit sans cela à l'esprit . Puis-je en quelque sorte éviter une copie de val dans le scénario? Je doute que std::move(val) en setVal fonctionnera car il ne prend pas une référence de valeur r.

A a; 
Val val; 
// populate val 
a.setVal(val); // I don't need val after here 
+0

Malheureusement, vous ne pouvez pas passer d'un objet 'const'. C'est pourquoi Herb Sutter a suggéré "que la vitesse veuille passer par la valeur". Avec ce constructeur, vous ne pouvez pas éviter une construction de copie ou une affectation de copie. – WhiZTiM

Répondre

0

Les déclarations en classe A indiquent clairement que getVal ne doit pas modifier l'objet et que la référence retournée ne doit pas être utilisé pour changer son soit pointée, de sorte que vous ne sont pas autorisés à utiliser que dans un mouvement. Cela étant dit, comme d_val n'est pas déclaré comme const, vous pouvez utiliser un const-cast pour supprimer constness sur la référence, mais vous devez savoir qu'il est mauvais et doit être évité.

Cela étant dit, vous ne pouvez pas utiliser setVal si vous voulez un assignement de déplacement, mais vous pouvez générer manuellement le mouvement:

A a; 
Val val; 
// populate val 

Val& av = const_cast<Val &>(a.getVal()); // cheating compiler... 
av = std::move(val); 
+0

Je ne comprends pas comment un casting const fonctionnerait, je ne peux pas changer le code de 'A'. – ytoledano