2

Estoy tratando de pasar una función que retorna un puntero *Get() , a una función que recibe un puntero doble view(int **) , pero no entiendo el error , se supone que si hago esto view(&Get()) la función debe recibir la dirección en donde esta almacenado el puntero . el codigo es el siguiente :

#include <iostream>
using std::cin; 
using std::cin; 
using std::cout; 
using std::string; 
using std::endl;  

int *Get();
void view(int **) ; 
int main()
{
    view(&Get()) ; **El error lo genera esta linea**
    return 0 ;  
}
int *Get()
{
    int *P = new int[5]; 
    for(int i=0; i!=5; i++){*(P+i) = i+5 ; } 
    return P; 
}

void view(int **a)
{
   cout <<"direcion get->"<< a << endl ;
   cout <<"direcion *get->"<< *a << endl ; 
   cout <<"direcion **get->"<< **a << endl ;  
}

el error que arroja el compilado es el siguiente

 lvalue required as unary '&' operand
MrDave1999
  • 7,491
  • 1
  • 7
  • 22

2 Answers2

2

EDIT

Como comenta Eequiis Vásquez estas pasando por referencia el resultado de la función que se aloja en una variable temporal (rvalue) y C++ no lo permite. Por lo que es necesario almacenar su valor en una variable (lvalue).

Para solucionarlo, utilice una variable para almacenar el resultado de Get().

Quedando de la siguiente manera:

#include <iostream>
using std::cin; 
using std::cin; 
using std::cout; 
using std::string; 
using std::endl;  

int *Get();
void view(int **) ; 
int main()
{
    int *p = Get();
    view(&p) ;
    return 0 ;  
}
int *Get()
{
    int *P = new int[5]; 
    for(int i=0; i!=5; i++){*(P+i) = i+5 ; } 
    return P; 
}

void view(int **a)
{
   cout <<"direcion get->"<< a << endl ;
   cout <<"direcion *get->"<< *a << endl ; 
   cout <<"direcion **get->"<< **a << endl ;  
}
DarkFrost
  • 587
  • 2
  • 11
  • 1
    La solución está bien, pero la explicación no. No se intenta pasar la función por referencia porque es una llamada por los paréntesis. Lo que se intenta pasar por referencia es la dirección del resultado, que es una variable temporal (rvalue), y eso C++ no lo permite. Al guardar el resultado en una variable (lvalue) se soluciona el problema. – Eequiis Jun 23 '20 at 16:58
  • Muchas gracias por la explicación. Me lo apunto para los futuros conocimientos y voy a editar la respuesta, para que pueda ayudar a alguien en el futuro en base a tu comentario. – DarkFrost Jun 23 '20 at 21:18
2

Get() es un rvalue. No se puede aplicar el & operador al rvalue. Ver tu mensaje de error:

lvalue required as unary '&' operand

Variables son lvalues, pero valores intermedios, como resultados de funciones, son rvalues. Entonces, necesitas introducir una variable:

int* p = Get();
view(&p);

Una nota al margen: en programación de C++ moderna, preferimos punteros inteligentes y std::vector. También, P[i] es siempre mejor que *(P+i).