Date: Sun, 11 Oct 2020 17:15:47 +0300
Hi!
C++ has rather complex name lookup rules for unqualified function calls
that involve argument-dependent lookup and may lead to surprising results.
And from time to time there appear proposals to fix those rules. This is
one of such proposals.
Most of the time invoking ADL is not what a user wanted. However, ADL also
has legitimate use cases: operators and "customization points" (swap,
begin, end are examples). The idea of the proposal is that we can mark
customization points with *operator* keyword and deprecate ADL for all
functions that are not marked with such keyword.
That is if ADL was triggered for an unqualified function call and a
function was found via ADL that was not an *operator, *then a compiler may
issue a warning. Currently it's not feasible to have such a warning,
because we cannot not discriminate between "good" ADL and "bad" ADL.
Declaration of a custom swap function then will look like this:
void operator swap (A& fst, A& snd);
There are other things that might be included in the proposal:
1) requesting ADL via operator keyword at the call-site: operator swap(a,
b);
2) searching "operator functions" among class members, thus allowing
uniform function call syntax at least for them.
But before exploring those directions further I would like to get feedback
on the main idea.
Regards,
Gregory
C++ has rather complex name lookup rules for unqualified function calls
that involve argument-dependent lookup and may lead to surprising results.
And from time to time there appear proposals to fix those rules. This is
one of such proposals.
Most of the time invoking ADL is not what a user wanted. However, ADL also
has legitimate use cases: operators and "customization points" (swap,
begin, end are examples). The idea of the proposal is that we can mark
customization points with *operator* keyword and deprecate ADL for all
functions that are not marked with such keyword.
That is if ADL was triggered for an unqualified function call and a
function was found via ADL that was not an *operator, *then a compiler may
issue a warning. Currently it's not feasible to have such a warning,
because we cannot not discriminate between "good" ADL and "bad" ADL.
Declaration of a custom swap function then will look like this:
void operator swap (A& fst, A& snd);
There are other things that might be included in the proposal:
1) requesting ADL via operator keyword at the call-site: operator swap(a,
b);
2) searching "operator functions" among class members, thus allowing
uniform function call syntax at least for them.
But before exploring those directions further I would like to get feedback
on the main idea.
Regards,
Gregory
Received on 2020-10-11 09:16:06