Title
Overload resolution with implicit and explicit object member functions
Status
drwp
Section
12.2.4.1 [over.match.best.general]
Submitter
Corentin Jabot

Created on 2023-08-08.00:00:00 last changed 3 weeks ago

Messages

Date: 2023-11-08.05:03:56

Proposed resolution (approved by CWG 2023-11-07):

Change in 12.2.4.1 [over.match.best.general] bullet 2.6 as follows:

  • ...
  • F1 and F2 are non-template functions with and
    • they have the same parameter-type-lists non-object-parameter-type-lists (9.3.4.6 [dcl.fct]), and
    • if they are member functions, both are direct members of the same class, and
    • if both are non-static member functions, they have the same types for their object parameters, and
    • F1 is more constrained than F2 according to the partial ordering of constraints described in 13.5.5 [temp.constr.order],
    or if not that,

    [ Example:

      template <typename T = int>
      struct S {
        constexpr void f();                      // #1
        constexpr void f(this S&) requires true; // #2
      };
    
      void test() {
        S<> s;
        s.f();                 // calls #2
      }
    

    -- end example ]

  • ...
Date: 2023-11-15.00:00:00

[Accepted as a DR at the November, 2023 meeting.]

Consider:

  template <typename T = int>
  struct S {
    constexpr void f();                      // #1
    constexpr void f(this S&) requires true; // #2
  };

  void test() {
    S<> s;
    s.f();                 // #3
  }

With the current rules, the call at #3 is ambiguous, even though #2 is more constrainted.

History
Date User Action Args
2024-04-05 21:43:46adminsetstatus: dr -> drwp
2023-12-19 10:15:28adminsetstatus: ready -> dr
2023-11-08 05:03:56adminsetstatus: review -> ready
2023-09-16 05:22:26adminsetmessages: + msg7434
2023-09-16 05:22:26adminsetstatus: open -> review
2023-08-08 00:00:00admincreate