81 votes

Existe-t-il des cas où le retour d'une référence RValue (&&) est utile?

Est-il une raison pour laquelle lorsqu'une fonction doit retourner une Référence RValue? Une technique, ou une astuce, ou un idiome ou modèle?

MyClass&& func( ... );

Je suis conscient du danger de retourner des références en général, mais parfois nous n'avons de toute façon, ce n'est pas nous (T& T::operator=(T) comme l'un des idiomatiques exemple). Mais qu'en est - T&& func(...)? Est-il général place nous permettrait de gagner de qui? Probablement différente quand on écrit de la Bibliothèque ou du code de l'API, comparativement à un peu de code client? -- juste une idée.

61voto

Howard Hinnant Points 59526

Il y a quelques occasions où cela convient, mais elles sont relativement rares. Le cas survient dans un exemple lorsque vous souhaitez autoriser le client à quitter un membre de données. Par exemple:

 template <class Iter>
class move_iterator
{
private:
    Iter i_;
public:
    ...
    value_type&& operator*() const {return std::move(*i_);}
    ...
};
 

17voto

Clinton Points 5556

Cela fait suite au commentaire de towi. Vous ne voulez jamais renvoyer de références à des variables locales. Mais vous pourriez avoir ceci:

 vector<N> operator+(const vector<N>& x1, const vector<N>& x2) { vector<N> x3 = x1; x3 += x2; return x3; }
vector<N>&& operator+(const vector<N>& x1, vector<N>&& x2)    { x2 += x1; return x2; }
vector<N>&& operator+(vector<N>&& x1, const vector<N>& x2)    { x1 += x2; return x1; }
vector<N>&& operator+(vector<N>&& x1, vector<N>&& x2)         { x1 += x2; return x1; }
 

Cela devrait empêcher toute copie (et attribution possible) dans tous les cas, sauf lorsque les deux paramètres sont des valeurs.

7voto

Puppy Points 90818

Non, retournez la valeur. Renvoyer des références en général n’est pas du tout dangereux, c’est dangereux de renvoyer des références à des variables locales . Renvoyer une référence de valeur, cependant, est plutôt inutile dans presque toutes les situations (je suppose que vous écriviez std::move ou quelque chose du genre).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X