8.3. Argumentos de funciones y valores de retorno

El uso del especificador const con argumentos de funciones y valores de retorno es otro lugar donde el concepto de constante puede resultar confuso. Si está pasando variables por valor, utilizar const no tiene significado para el cliente (significa que el argumento que se pasa no puede modificarse en la función). Si está devolviendo por valor un objeto de un tipo definido por el usuario y utiliza el especificador const, significa que el valor de retorno no puede modificarse. Si pasa o devuelve direcciones, const es una promesa de que el destino de la dirección no se modificará.

8.3.1. Paso por valor constante

Puede indicar que los argumentos de funciones son constantes cuando se pasan por valor, como en:

void f1(const int i) {
    i++; // ilegal
}

pero, ¿qué significa esto? Está prometiendo que la función f1() no cambiará el valor original de la variable. Sin embargo, como el argumento se pasa por valor, inmediatamente se hace una copia de la variable original, así que la promesa al cliente se cumple implícitamente.

Dentro de la función, const sí toma un significado: el argumento no se puede cambiar. Así que, en realidad, es una herramienta para el programador de la función, no para el que la usa.

Para evitar la confusión del usuario de la función, puede hacer que el argumento sea constante dentro de la función en lugar de en la lista de argumentos. Podría hacerlo con un puntero, pero la sintaxis más adecuada para lograrlo es la referencia, algo que se tratará en profundidad en el Capítulo 11.

Brevemente, una referencia es como un puntero constante que se dereferencia automáticamente, así que es como tener un alias de la variable. Para crear una referencia, debe usar el símbolo & en la definición. La definición de la función libre de confusiones queda así:

void f2(int ic) {
    const int &i = ic;
    i++;  // ilegal (error de compilación)
}

De nuevo, aparece un mensaje de error, pero esta vez el especificador const no forma parte del prototipo de la función; sólo tiene sentido en la implementación de la función y por lo tanto es invisible para el cliente.