Duplicar posible:
Functions with const arguments and Overloading¿Por qué los calificadores const en los argumentos de función se usan para sobrecargar la resolución?
estoy bastante confundido por la sobrecarga y reglas de declaración const. Aquí hay dos cosas que me desconciertan, tal vez puedas ayudarme a encontrar el malentendido más profundo en mi cabeza que hace que me resulten desconcertantes. ;)
Primera edición:
Mi compilador permite esto:
void f(int & x) {
std::cout << "plain f" << std::endl;
}
void f(const int & x) {
std::cout << "const f" << std::endl;
}
Pero la siguiente provoca un error de compilación (función ya tiene un cuerpo):
void f(int x) {
std::cout << "plain f" << std::endl;
}
void f(const int x) {
std::cout << "const f" << std::endl;
}
que supongo tiene sentido porque pensé que la const estaba solo allí para decirle al compilador que el objeto que se pasa no se cambia y en el segundo caso se copia de todos modos. Pero si eso es correcto, ¿por qué puedo sobrecargar funciones usando const?
En otras palabras, ¿por qué si utilizo la versión de compilación y llamar a las funciones de la siguiente manera:
int x1 = 5;
const int x2 = 5;
f(x1);
f(x2);
Cómo llego "f normal" y "f const" en lugar de "f const" dos veces? Aparentemente ahora también estoy usando el const para decirle al compilador qué función llamar no solo para que la referencia no cambie. Esto se vuelve más confuso porque si elimino la versión "simple", funciona bien y llama a la versión "const" dos veces.
¿Cuál es mi pregunta actual? Me gustaría saber cuáles son las ideas detrás de este comportamiento porque, de lo contrario, memorizarlo es muy difícil.
Los calificadores 'const' de nivel superior en los parámetros de la función _se eliminan_ al determinar la firma de una función. 'void f (int)' y 'void f (const int)' se refieren a la misma función. El nivel superior 'const' no se usa para la resolución de sobrecarga. 'const' más abajo en un tipo derivado (como en' const int & ') influye en los tipos de parámetros de función y, por lo tanto, en la firma de la función. –
Vea también: http://stackoverflow.com/questions/4212932/defining-a-function-with-different-signature –
@CharlesBailey Gracias por los enlaces. De alguna manera no los encontré, lo siento. – Sarien