Title
Conflict in reference binding vs overload resolution
Status
cd3
Section
9.4.4 [dcl.init.ref]
Submitter
Johannes Schaub

Created on 2011-05-31.00:00:00 last changed 90 months ago

Messages

Date: 2013-04-15.00:00:00

[Moved to DR at the April, 2013 meeting.]

Date: 2011-08-15.00:00:00

Proposed resolution (August, 2011):

  1. Change 12.2.2.7 [over.match.ref] paragraph 1 as follows:

    • The conversion functions of S and its base classes are considered, except that for copy-initialization, only the non-explicit conversion functions are considered. Those that are not hidden within S and yield type “lvalue reference to cv2 T2” (when 9.4.4 [dcl.init.ref] requires an lvalue result initializing an lvalue reference or an rvalue reference to function) or “cv2 T2” or “rvalue reference to cv2 T2” (when 9.4.4 [dcl.init.ref] requires an rvalue result initializing an rvalue reference or an lvalue reference to function), where “cv1 T” is reference-compatible (9.4.4 [dcl.init.ref]) with “cv2 T2”, are candidate functions.

  2. Change 12.2.4 [over.match.best] paragraph 1 as follows:

    • ...

    • the context is an initialization by user-defined conversion... or if not that,

    • the context is an initialization by conversion function for direct reference binding (12.2.2.7 [over.match.ref]) of a reference to function type, the return type of F1 is the same kind of reference (i.e. lvalue or rvalue) as the reference being initialized, and the return type of F2 is not [Example:

        template <class T> struct A {
          operator T&();  // #1
          operator T&&(); // #2
        };
        typedef int Fn();
        A<Fn> a;
        Fn& lf = a;      // calls #1
        Fn&& rf = a;     // calls #2
      

      end example] or, if not that,

    • F1 is a non-template function...

Date: 2012-09-24.00:00:00

According to 12.2.2.7 [over.match.ref] paragraph 1, the determination of the candidate functions is based on whether 9.4.4 [dcl.init.ref] requires an lvalue result or an rvalue result. It is not sufficiently clear exactly what this means, particularly with respect to function lvalues and rvalues.

History
Date User Action Args
2014-03-03 00:00:00adminsetstatus: drwp -> cd3
2013-10-14 00:00:00adminsetstatus: dr -> drwp
2013-05-03 00:00:00adminsetmessages: + msg4409
2013-05-03 00:00:00adminsetstatus: ready -> dr
2012-09-24 00:00:00adminsetmessages: + msg3871
2012-02-27 00:00:00adminsetstatus: tentatively ready -> ready
2012-01-17 00:00:00adminsetstatus: review -> tentatively ready
2011-05-31 00:00:00admincreate