Sé que hay pocas preguntas acerca de const correctness donde se indica que la declaración de una función y su definición no necesitan acordar parámetros de valor. Esto se debe a que la consistencia de un parámetro de valor solo importa dentro de la función. Esto está bien:Corrección de const para los parámetros de valor
// header
int func(int i);
// cpp
int func(const int i) {
return i;
}
¿Está haciendo esto realmente una mejor práctica? Porque nunca he visto a nadie hacerlo. He visto esta cita (no estoy seguro de la fuente) en otros lugares esto se ha discutido:
"In fact, to the compiler, the function signature is the same whether you include this const in front of a value parameter or not."
"Avoid const pass-by-value parameters in function declarations. Still make the parameter const in the same function's definition if it won't be modified."
El segundo párrafo dice que no pone la const en la declaración. Supongo que esto se debe a que la consistencia de un parámetro de valor no tiene sentido como parte de una definición de interfaz. Es un detalle de implementación.
Según esta recomendación, ¿también se recomienda para los valores de puntero de los parámetros del puntero? (No tiene sentido en un parámetro de referencia, puesto que no se puede volver a asignar una referencia.)
// header
int func1(int* i);
int func2(int* i);
// cpp
int func1(int* i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compiles without error
return *i;
}
int func2(int* const i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compile error
return *i;
}
Resumen: Haciendo parámetros de valor es útil para capturar algunos errores lógicos. ¿Es una mejor práctica? ¿Vas al extremo de dejar la const fuera del archivo de cabecera? ¿Es tan útil para establecer valores de puntero? ¿Por qué o por qué no?
Algunas referencias:
C++ const keyword - use liberally? Use of 'const' for function parameters
Un ejemplo de cuando los parámetros de valor const son útiles:
bool are_ints_equal(const int i, const int j) {
if (i = j) { // without the consts this would compile without error
return true;
} else {
return false;
}
// return i = j; // I know it can be shortened
}
Se llama la "si (i = j)" error en este caso, pero no recoge todas las tales errores, así que no me entusiasmaría demasiado con esa lógica en particular (ya que puedes cometer el mismo error con las variables). Incluso sin la const, tu compilador debería advertirte sobre esto si le dices que quieres advertencias. – nobar
El punto de entusiasmarse con 'if (i = j)' es darse cuenta de que los parámetros del valor de const no son solo de pelusa. El ejemplo de Michael Burr es incluso mejor que este. – jmucchiello
En una situación en la que no está cambiando los parámetros de las funciones, debe configurarlos porque A) es más seguro, B) es autodocumentado, y C) es más fácil de depurar. Además, el prototipo y el encabezado deben marcarse const. Es confuso si solo lo hecho en el encabezado de la función. El argumento sobre la creación de una variable temporal dentro de la función es una situación en la que probablemente no necesite declarar los parámetros const. Son mis 2 centavos. –