J'essayais un programme sur les références universelles en appliquant std::move
et std::forward
sur eux. Jusqu'à aujourd'hui j'ai supposé que les deux étaient les mêmes mais dans ce programme même (donné ci-dessous) la sortie m'a étonné.déplacer vs transmettre sur les références universelles
#include <iostream>
#include <string>
#include <utility>
using namespace std;
class X
{
string take="";
public:
template<class T>
void pass1 (T &&str) // str is a universal reference as it can bind to anything, both rvalue and lvalue references
{
take=move(str);
}
template<class T>
void pass2 (T &&str)
{
take=forward<T>(str);
}
void show()
{
cout<<"take = "<<take<<"\n";
}
}obj;
int main()
{
cout<<"using move on universal reference:-\n";
string str="he is there";
cout<<"str = "<<str<<'\n';
obj.pass1(str);
obj.show();
if (str.empty())
cout<<"str is empty\n\n";
else
cout<<"str isnt empty\n\n";
cout<<"using forward on universal reference:-\n";
str="he was there";
cout<<"str = "<<str<<'\n';
obj.pass2(str);
obj.show();
if (str.empty())
cout<<"str is empty\n\n";
else
cout<<"str isnt empty\n\n";
return 0;
}
Sortie:
using move on universal reference:-
str = he is there
take = he is there
str is empty
using forward on universal reference:-
str = he was there
take = he was there
str isnt empty
*/
Mes questions sont les suivantes:
- Pourquoi les sorties différentes?
- Ne pas
move
etforward
fonctionnent de manière similaire? Comment fonctionnent-ils différemment (dans le contexte du code ci-dessus)?
Utilisez 'move' avec des références rvalue et' forward 'avec des références de transfert (" universal "). –
Et quelle est la question? – Jarod42
Duplicates: http://stackoverflow.com/q/9671749, http://stackoverflow.com/q/13219484 –