Passing Non-Const References to Overloaded Functions
Why does the compiler prefer a non-const reference parameter over a const reference when I pass a non-const variable?
When you pass a non-const variable (like a non-const int) to an overloaded function, and one overload takes a non-const reference (int&) while another takes a const reference (const int&), the compiler will prefer the non-const reference overload.
This is because binding a non-const reference to a non-const variable is considered an exact match, while binding a const reference to a non-const variable requires a trivial conversion (adding const).
Here's an example:
#include <iostream>
void Print(int& x) {
std::cout << "non-const ref overload";
}
void Print(const int& x) {
std::cout << "const ref overload";
}
int main() {
int x = 10;
Print(x);// calls Print(int&)
}non-const ref overloadThe output will be "non-const ref overload", because x is non-const and thus prefers the non-const reference overload.
Understanding Overload Resolution
Learn how the compiler decides which function to call based on the arguments we provide.