vendredi 24 août 2018

What's the difference between an ordinay rvalue reference and one returned by std::forward?

I can't do this:

int &&q = 7;
int &&r = q; 
//Error Message:
//cannot convert from 'int' to 'int &&'
//You cannot bind an lvalue to an rvalue reference

If I understand correctly, when intializing a rvalue reference, there's a temporary variable got initialized too. So int &&q = 7; can be considered as:

int temp = 7;
int &&q = temp;

And when using a reference on the right side, I am actually using the referee. So int &&r = q; can be considered as:

int &&r = temp;  //bind a lvalue to a rvalue reference, cause error, understandable

So above is how I understand the compiler error occurs.


Why adding std::forward can solve that?

int &&q = 7;
int &&r = std::forward<int>(q);

I know the std::forward always returns a rvalue reference, how is the reference returned by std::forward different from int&&q

Aucun commentaire:

Enregistrer un commentaire