c++ pass-by-reference lvalue-to-rvalue

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