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 una variable de un tipo derivado y utiliza el especificador const, significa que el valor de retorno no puede modificarse. Si pasa o devuelve direcciones, const impide que el destinatario de la dirección pueda modificarse.

8.3.1. Paso por valor constante

Puede indicar que los argumentos de funciones son constantes cuando se pasa por valor como:

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

pero, ¿qué significa esto? Está impidiendo que el valor de la variable original pueda ser cambiado en la función f1(). De todos formas, como el argumento se pasa por valor, es sabido que inmediatamente se hace una copia de la variable original, así que dicha restricción se cumple implícitamente sin necesidad de usar el especificador const.

Dentro de la función, const si 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 capitulo 11[FIXME:XREF].

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. De ese modo se tiene una definición libre de confusiones.

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 de la cabecera de la función, solo tiene sentido en la implementación de la función y por la tanto es invisible para el cliente.