Possible Duplicate:
Functions with const arguments and Overloading
I am pretty confused by the overloading and const declaration rules. Here are two things that puzzle me maybe you can help me find the deeper misunderstanding in my head that result in them being puzzling to me. ;)
First issue:
My compiler allows this:
void f(int & x) {
std::cout << "plain f" << std::endl;
}
void f(const int & x) {
std::cout << "const f" << std::endl;
}
But the following causes a compile error (function already has a body):
void f(int x) {
std::cout << "plain f" << std::endl;
}
void f(const int x) {
std::cout << "const f" << std::endl;
}
Which I suppose makes sense because I thought the const was only there to tell the compiler that the object being passed is not changed and in the second case it is copied anyway. But if that is correct then why can I overload functions using const?
In other words, why if I use the compiling version and call the functions like this:
int x1 = 5;
const int x2 = 5;
f(x1);
f(x2);
do I get "plain f" and "const f" instead of "const f" twice? Apparently now I am also using the const to tell the compiler which function to call not only that the reference doesn't change. This gets more confusing because if I remove the "plain" version it works just fine and calls the "const" version twice.
Now what is my actual question? I would like to know what the ideas behind this behavior are because otherwise memorizing it is very hard.
constqualifiers on function parameters are removed when determining a function's signature.void f(int)andvoid f(const int)refer to the same function. Top levelconstis not used for overload resolution.constfurther down a derived type (such as inconst int&) do influence the types of function parameters and hence the function signature.