Re: function template explicit specialization not chosen
On 19 Apr., 10:43, Daniel Kr??gler <daniel.krueg...@googlemail.com>
wrote:
On 2012-04-19 06:53, ??? ??? wrote:
struct dummy { };
template<typename T> int hash (T);
template<typename T> int hash (T t) { return t; } // (1)
template<> int hash (dummy const&) { return 0; } // (2)
int main ()
{
dummy a;
dummy const&b = a;
hash(b); // expect (2) called
}
....
(1) What does the standard (c++11) say about the call to hash with
b, should T be deduced to be dummy const&, or should it be dummy
const?
It won't be deduced to be dummy const&, that is for sure. The rules
for selection of function templates in this context is uniformly
described by 14.8.2.1 [temp.deduct.call]. The function parameter
type P here is not a reference type, therefore we need to consider
p2:
"If P is not a reference type: [..] If A is a cv-qualified type, the
top level cv-qualifiers of A???s type are ignored for type deduction."
So even though the argument type A is a cv-qualified type (The type
is 'dummy const'), this is irrelevant here. As a rule of thumb one
should remember that a function template that looks like using
"by-value" arguments, will have this way, unless you provide
explicit template parameters that would change that.
Can you please explain why the type is 'dummy const', not 'dummy
const&'? The function argument b clearly is a reference. Is there
some rvalue- to- lvalue conversion involved, and if so, why does it
happen before the function type is completely deduced?
-- Hannes
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]