Search code examples
c++overloadinglanguage-lawyerc++23

Does that the current draft permit to form an overload set that consists of two non-static member declarations where one has ref-qualifier


The basic.scope#scope-3.3.1 says

both declare functions with the same parameter-type-list, equivalent ([temp.over.link]) trailing requires-clauses (if any, except as specified in [temp.friend]), and, if both are non-static members, the same cv-qualifiers (if any) and ref-qualifier (if both have one)

The above rule could be understood to, For two non-static member functions with the same parameter-type-list, if anyone has a cv-qualifiers then both declarations should have the same cv-qualifiers; if both declarations have ref-qualifier, they should have the same ref-qualifier. Otherwise, they do not correspond.

struct A{
    void show();  //#1
    void show() const &;  //#2
};

In this snippet, Does #1 correspond to #2? Since #2 has a cv-qualifier but #1 does not have, even if the condition for having the same ref-qualifier is true, as per the rule(note the emphasized and in that rule), they do not correspond. So, Does it mean that the draft permits to form an overload set from such two declarations? After all, the section over.load#2.3 was removed by P1787.


Solution

  • This change was an inadvertent result of phrasing the rules more orthogonally, but since that orthogonality allows a few additional meaningful overload sets, there hasn’t been any hurry to “fix” it. In particular, it might work well with the proposal for deducing this that’s currently under consideration.