Eric Lemings wrote:
-----Original Message-----
From: Martin Sebor [mailto:[EMAIL PROTECTED] On Behalf Of Martin Sebor
Sent: Wednesday, July 02, 2008 5:17 PM
To: [email protected]
Subject: Re: error on tuple copy ctor
Eric Lemings wrote:
...
AFAICS, this is the same as S(S&&).
I was wrong. S::S(S&&&) is the same thing as S::S(S&). I.e., "an
rvalue reference to an lvalue reference" collapses into a plain
old (lvalue) reference.
Doesn't preferring a template
over an ordinary function with the same signature seem wrong?
Wrong, possibly. Certainly not what one might expect.
I *think* I understand the rules now. Consider the example
in [temp.deduct.call], p3 of the latest WP (N2691):
template <class T> void f (T&&);
int i;
int j = f (i);
Argument deduction instantiates "f<int&>(T&&&)" which after
collapsing the references is the same as f<int&>(T&). I.e.,
we end up calling a specialization of f for int&, which is
a better match than an overload (or specialization) of f for
int&&, since i is an lvalue and binding a (named) lvalue to
an rvalue (reference) involves an lvalue to rvalue conversion.
In fact, the generated specialization of f<int&> is an exact
match for i.
Martin