c++ - Inicialización no válida de referencia no constante de tipo
pass-by-reference lvalue-to-rvalue (3)
O, si tiene un compilador compatible con C ++ 11, puede usar el llamado enfoque de referencia universal, que, mediante reglas de colapso de referencia, puede vincularse tanto a las referencias de valor lvalue como 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;
}
O, en C ++ 14,
void printAge(auto&& person) {
cout << "Age: " << person.age << endl;
}
En el siguiente código, no puedo pasar un objeto temporal como argumento a la función 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;
}
El error que recibo es:
error: invalid initialization of non-const reference of type ‘Person&’ from an rvalue of type ‘Person’
Me doy cuenta de que esto es algo que tiene que ver con pasar un lValue a una función que espera un rValue ... ¿Hay alguna forma de convertir mi lValue a rValue usando std :: move o algo? Intenté tomar un parámetro constante, pero eso no parece funcionar.
Simplemente haga que su función de impresión tome su argumento con const&
. Esto también es lógicamente correcto ya que no modifica su argumento.
void printAge(const Person &person) {
cout << "Age: " << person.age << endl;
}
El problema real es al revés. Está pasando un valor temporal (rvalue) a una función que espera un valor l.
Su código no funciona si ejecuta los compiladores g ++ o gcc. void printAge(const Person &person)
agregar const
a void printAge(const Person &person)
. Sin embargo, en Visual Studio funcionará bien. He probado VS2010 y VS2012 y en los dos códigos siguientes funciona bien.
#include<iostream>
using namespace std;
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)); // DOES NOT fail!
printAge(p);
return 0;
}