es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Imprimiendo un vector en C++ – ¿por qué se debe pasar el vector como constante o como copia?

He estado probando con vectores y escribiendo mi propia función que imprime sus elementos. Esta función es fácil de programar, pero noté un pequeño detalle que no puedo explicar.

Digamos que tengo la siguiente función que imprime los elementos (solo muestro la declaración aquí):

void print(vector<int> vec);

Y que tengo otra función que crea y devuelve un vector:

vector<int> create_vector( //parámetros);

Y por último, digamos que en mi función principal quería ejecutar algo en la línea de

print(create_vector(// algunos parámetros));

Noté que esto funciona. Lo que también funciona es si paso mi vector a mi función print como una referencia constante:

void print(const vector<int>& vec);

Sin embargo, lo que no funciona es si simplemente lo paso por referencia

void print(vector<int>& vec);

y obtengo el siguiente error:

error: cannot bind non-const lvalue reference of type ‘std::vector&’ to an rvalue of type ‘std::vector’

Pensaría que esto se debe a que estoy tratando de imprimir una variable que aún no se ha realizado, pero si ese es el caso, ¿cómo es que funciona cuando se pasa como referencia constante?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual pasar el vector por referencia no funciona, pero pasarlo por referencia constante o por valor sí funciona, es porque al pasar el vector como referencia no constante, se espera una referencia modifiable de lvalue, que es una referencia a una variable que se puede modificar. Sin embargo, cuando se pasa el resultado de una llamada a una función (como create_vector()), esto crea un objeto temporal o rvalue, que no es modificable y por lo tanto no se puede pasar como referencia no constante.

    Al pasar el vector por referencia constante, se le está diciendo a la función que puede usar el vector como una referencia de solo lectura, y como es una referencia constante, puede aceptar tanto lvalues como rvalues.

    Al pasar el vector por valor, se está haciendo una copia del vector, por lo que no importa si es un lvalue o un rvalue.

    En resumen, pasar un vector por referencia no constante solo funciona cuando se pasa un lvalue modificable, mientras que pasarlo por referencia constante o por valor funciona tanto para lvalues como para rvalues tanto modificables como no modificables.

Comments are closed.