CWG2931 [over.oper] Mis-worded restriction on operator functions · Issue #600 · cplusplus/CWG (original) (raw)
Reference (section label): [over.oper.general]
Issue description:
The current wording reads:
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.
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:
struct A { bool operator==(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-objectparameter whose type is a class, a reference to a class, an enumeration, or a reference to an enumeration.
Unless we want to disallow something like this:
struct B { bool operator==(this int, int); operator int() const; };
in which case we probably just want to say:
An operator function shall
eitherbe amember function or be a non-memberfunction that has at least onenon-objectparameter whose type is a class, a reference to a class, an enumeration, or a reference to an enumeration.