web-dev-qa-db-fra.com

Initialisation non valide de la référence non constante de type

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.

16
jeffreyveon

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.

16
inf

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;
}
10
vsoftco