corresponding argument. Deduction is done as for class templates.
The arguments used in deduction have reference and top level cv
qualifiers removed. Iff both arguments were originally reference
- types *and* deduction succeeds in both directions, the template
+ types *and* deduction succeeds in both directions, an lvalue reference
+ wins against an rvalue reference and otherwise the template
with the more cv-qualified argument wins for that pairing (if
neither is more cv-qualified, they both are equal). Unlike regular
deduction, after all the arguments have been deduced in this way,
int deduce1, deduce2;
int quals1 = -1;
int quals2 = -1;
+ int ref1 = 0;
+ int ref2 = 0;
if (TREE_CODE (arg1) == TYPE_PACK_EXPANSION
&& TREE_CODE (arg2) == TYPE_PACK_EXPANSION)
if (TREE_CODE (arg1) == REFERENCE_TYPE)
{
+ ref1 = TYPE_REF_IS_RVALUE (arg1) + 1;
arg1 = TREE_TYPE (arg1);
quals1 = cp_type_quals (arg1);
}
if (TREE_CODE (arg2) == REFERENCE_TYPE)
{
+ ref2 = TYPE_REF_IS_RVALUE (arg2) + 1;
arg2 = TREE_TYPE (arg2);
quals2 = cp_type_quals (arg2);
}
/* "If, for a given type, deduction succeeds in both directions
(i.e., the types are identical after the transformations above)
- and if the type from the argument template is more cv-qualified
- than the type from the parameter template (as described above)
- that type is considered to be more specialized than the other. If
- neither type is more cv-qualified than the other then neither type
- is more specialized than the other." */
-
- if (deduce1 && deduce2
- && quals1 != quals2 && quals1 >= 0 && quals2 >= 0)
+ and both P and A were reference types (before being replaced with
+ the type referred to above):
+ - if the type from the argument template was an lvalue reference and
+ the type from the parameter template was not, the argument type is
+ considered to be more specialized than the other; otherwise,
+ - if the type from the argument template is more cv-qualified
+ than the type from the parameter template (as described above),
+ the argument type is considered to be more specialized than the other;
+ otherwise,
+ - neither type is more specialized than the other." */
+
+ if (deduce1 && deduce2)
{
- if ((quals1 & quals2) == quals2)
- lose2 = true;
- if ((quals1 & quals2) == quals1)
- lose1 = true;
+ if (ref1 && ref2 && ref1 != ref2)
+ {
+ if (ref1 > ref2)
+ lose1 = true;
+ else
+ lose2 = true;
+ }
+ else if (quals1 != quals2 && quals1 >= 0 && quals2 >= 0)
+ {
+ if ((quals1 & quals2) == quals2)
+ lose2 = true;
+ if ((quals1 & quals2) == quals1)
+ lose1 = true;
+ }
}
if (lose1 && lose2)