Created on 2022-05-07.00:00:00 last changed 2 weeks ago
Suggested resolution:
Change in 11.4.6 [class.copy.assign] paragraph 1 as follows:
A user-declared copy assignment operator X::operator= is a non-static non-template member function of class X with exactly one non-object parameter of type X, X&, const X&, volatile X&, or const volatile X&.
Change in 11.4.6 [class.copy.assign] paragraph 3 as follows:
A user-declared move assignment operator X::operator= is a non-static non-template member function of class X with exactly one non-object parameter of type X&&, const X&&, volatile X&&, or const volatile X&&.
Change in 11.10.1 [class.compare.default] paragraph 1 as follows:
A defaulted comparison operator function (12.4.3 [over.binary]) for some class C shall be a non-template function that is
- a non-static
const non-volatilememberof C having one parameter of type const C& and either no ref-qualifier or the ref-qualifier &, oror friend of C anda friend of C havingeither has two parameters of type const C& or two parameters of type C , where the implicit object parameter (if any) is considered to be the first parameter..
"Deducing this" allows to declare assignment and comparison operator functions as explicit object member functions.
However, such an assignment operator can never be a copy or move assignment operator, which means it always conflicts with the implicitly-defined one:
struct C {
C& operator=(this C&, C const&); // error: can't overload with the copy assignment operator
};
Similarly, operator== or operator<=> can be declared with an explicit object parameter, but they cannot be defaulted:
struct D {
bool operator==(this D const&, D const&) = default; // error: not a kind of comparison that can be defaulted
};
There seems to be no reason to disallow that, for people who prefer writing all of their members with explicit object parameters.
History | |||
---|---|---|---|
Date | User | Action | Args |
2022-05-12 10:32:53 | admin | set | messages: + msg6829 |
2022-05-07 00:00:00 | admin | create |