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 overload

The 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.

Questions & Answers

Answers are generated by AI models and may not have been reviewed. Be mindful when running any code on your device.

Overloading Functions with Default Arguments
Can I overload functions that differ only in their default arguments?
Debugging Overload Resolution Failures
How can I debug a situation where the compiler is not selecting the overload I expect it to?
Overload Resolution with Function Templates
How does overload resolution work when there are both function templates and non-template functions?
Overloading on const-ness of Parameters
Can I overload a function based on whether a parameter is const or non-const?
Overloading on const-ness of *this
Can I overload member functions based on the const-ness of the object they're called on?
Overloading in Derived Classes
If I overload a function in a base class, can I also overload it in a derived class?
Or Ask your Own Question
Get an immediate answer to your specific question using our AI assistant