An interesting case of function overloading in C++
Posted
Aka. Yet Another Reason Why C++ is a Broken Language
Consider the following code
#include <iostream>
void foo(int&&) {
std::cout << "int\n";
}
void foo(float&&) {
std::cout << "float\n";
}
int main() {
int x = 1;
float y = 1.0;
foo(x);
foo(y);
}
What do you expect this to print? If you think "int" followed by "float", then you'd be wrong. It actually prints them the other way around!
This is because int&&
is an rvalue reference, meaning it binds to rvalues. x
however is an lvalue. But there is hope! An implicit conversion exists from int
to
float
, which produces an rvalue float
! And so it does that conversion and calls
the float&&
overload. y
does the same thing, and calls the int&&
overload.
Gotta love C++