2011-06-09 20 views
5

Tengo una función que me da el error "no puedo convertir de 'int' a 'int &'" cuando intento compilarla.Funciones de referencia en C++

int& preinc(int& x) { 
    return x++; 
} 

Si sustituyo x ++ con x, se compilará, pero no estoy seguro de cómo lo hace diferente. Pensé que x ++ devuelve x antes de que incremente x, entonces ¿no debería "devolver x ++" ser lo mismo que "devolver x" con respecto a lo que devuelve Preinc? Si el problema es con el operador ++ actuando en x, entonces ¿por qué no generará ningún error si coloco la línea "x ++" antes o después de la instrucción return, o reemplace x ++ con ++ x?

+2

Llamaría a esto "postinc" en lugar de "preinc" .... –

+1

Gracias a todos los que respondieron la pregunta. No me di cuenta de que x ++ hizo una copia temporal. Tiene sentido ahora. –

+0

se espera que usted acepte una de las respuestas a continuación. –

Respuesta

11

crea una copia temporal del original, incrementa el original y luego devuelve el temporal.

Como su función devuelve una referencia, está intentando devolver una referencia a la copia temporal, que es local para la función y, por lo tanto, no es válida.

11

Su función hace dos cosas:

  • incrementos del x que se pasa en referencia
  • devuelve una referencia a la locales resultado de la expresión x++

La referencia a un local no es válido, y devolver algo de esta función parece completamente redundante.

La siguiente es fijo, pero todavía creo que haya un mejor enfoque:

int preinc(int& x) { 
    return x++; // return by value 
} 
4

Sí, x++ devuelve x antes de que se incrementa. Por lo tanto, debe devolver una copia, la copia es temporal y solo puede pasar los temporales como referencias constantes.

++x por el contrario devuelve el original x (aunque incrementado), por lo tanto, funcionará con su función.