Dans le code suivant, je ne peux pas passer un objet temporaire comme argument à la fonction printAge
:
struct Person {
int age;
Person(int _age): age(_age) {}
};
void printAge(Person &person) {
cout << "Age: " << person.age << endl;
}
int main () {
Person p(50);
printAge(Person(50)); // fails!
printAge(p);
return 0;
}
L'erreur que j'obtiens est:
error: invalid initialization of non-const reference of type ‘Person&’ from an rvalue of type ‘Person’
Je me rends compte que c'est quelque chose à voir avec le passage d'une lValue à une fonction qui attend une rValue ... Y a-t-il un moyen de convertir ma lValue en rValue en utilisant std :: move ou quelque chose? J'ai essayé de prendre un paramètre constant, mais cela ne semble pas fonctionner.
Faites simplement que votre fonction d'impression prenne votre argument par const&
. C'est également logique, car cela ne modifie pas votre argument.
void printAge(const Person &person) {
cout << "Age: " << person.age << endl;
}
Le vrai problème est l'inverse. Vous passez une valeur temporaire (rvalue) à une fonction qui attend une valeur l.
Ou, si vous avez un compilateur compatible C++ 11, vous pouvez utiliser l'approche dite de référence universelle, qui, via des règles de regroupement de références, peut se lier aux références lvalue et rvalue:
#include <iostream>
using namespace std;
struct Person {
int age;
Person(int _age): age(_age) {}
};
template<typename T> // can bind to both lvalue AND rvalue references
void printAge(T&& person) {
cout << "Age: " << person.age << endl;
}
int main () {
Person p(50);
printAge(Person(50)); // works now
printAge(p);
return 0;
}
Ou, en C++ 14,
void printAge(auto&& person) {
cout << "Age: " << person.age << endl;
}