Given all three functions, this call is ambiguous.
int f( int );
int f( int && );
int f( int const & );
int q = f( 3 );
Removing f( int )
causes both Clang and GCC to prefer the rvalue reference over the lvalue reference. But instead removing either reference overload results in ambiguity with f( int )
.
Overload resolution is usually done in terms of a strict partial ordering, but int
seems to be equivalent to two things which are not equivalent to each other. What are the rules here? I seem to recall a defect report about this.
Is there any chance int &&
may be preferred over int
in a future standard? The reference must bind to an initializer, whereas the object type is not so constrained. So overloading between T
and T &&
could effectively mean "use the existing object if I've been given ownership, otherwise make a copy." (This is similar to pure pass-by-value, but saves the overhead of moving.) As these compilers currently work, this must be done by overloading T const &
and T &&
, and explicitly copying. But I'm not even sure even that is strictly standard.