You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
be a non-member function that has at least one non-object parameter whose type is a class, a reference to a class, an enumeration, or a reference to an enumeration.
This split doesn't make much sense, because non-member functions cannot have object parameters, so why explicitly mention non-object parameter there?
Deducing this (P0847) added:
An operator function shall either be a non-static member function or be a non-member function that has at least one non-object parameter whose type is a class, a reference to a class, an enumeration, or a reference to an enumeration.
Which, in retrospect, was probably incorrect. If that restriction applies to both "non-static member function" and "non-member function", then it disallows this for no good reason:
structA { booloperator==(this A, int); };
If it only applies to "non-member function" (as static operator() splitting up the bullets clarified), then the restriction makes no sense.
I think the wording we want here is:
An operator function shall either
be a member function or
be a non-member function that has at least one non-object parameter whose type is a class, a reference to a class, an enumeration, or a reference to an enumeration.
An operator function shall either be a member function or be a non-member function that has at least one non-object parameter whose type is a class, a reference to a class, an enumeration, or a reference to an enumeration.
The text was updated successfully, but these errors were encountered:
All compilers accept the operator==(this A, int) example. As for the operator==(this int, int) example, Clang and GCC accept it while EDG and MSVC reject it.
I think operator==(this int, int) should be rejected because, if we accept it, then there's no reason not to also accept non-member operator==(int, int). Both of them could be found by name lookup under appropriate circumstances where at least one operand has class type, yet we've always disallowed the second one, so for consistency the first one should be disallowed too.
jensmaurer
changed the title
[over.oper] Mis-worded restriction on operator functions
CWG2931 [over.oper] Mis-worded restriction on operator functions
Aug 31, 2024
Reference (section label): [over.oper.general]
Issue description:
The current wording reads:
This split doesn't make much sense, because non-member functions cannot have object parameters, so why explicitly mention non-object parameter there?
Deducing this (P0847) added:
Which, in retrospect, was probably incorrect. If that restriction applies to both "non-static member function" and "non-member function", then it disallows this for no good reason:
If it only applies to "non-member function" (as
static operator()
splitting up the bullets clarified), then the restriction makes no sense.I think the wording we want here is:
Unless we want to disallow something like this:
in which case we probably just want to say:
The text was updated successfully, but these errors were encountered: