On Mon, Jun 8, 2020 at 9:22 PM Ville Voutilainen via Core <
[email protected]> wrote:

> On Tue, 9 Jun 2020 at 03:55, Peter Dimov <[email protected]> wrote:
> >
> > Ville Voutilainen wrote:
> >
> > > And *callers* do no using-declarations, and no ifdeffing.
> >
> > This will only work if get<> is visible to normal lookup. (Well it works
> > under Clang, with a warning that it's C++20 only.)
> > https://godbolt.org/z/Z3LkwJ
>
> So? John's work-around makes get<> visible to normal lookup, thus:
> https://godbolt.org/z/Zvqjze
>
> With C++20 in hand, the work-around can be removed.


Richard has already shown a reason the "work-around" cannot in general be
removed:
https://godbolt.org/z/gFHK-2

struct get {};

int fail_in_cpp20()
{
  QtPair tp{ 1, 2 };
  // return get<0>( tp ); // fails to compile
}

int succeed()
{
  QtPair tp{ 1, 2 };
  using std::get;  // the "std::swap two-step" for calling ADL-only
functions
  return get<0>( tp );
}

The programmer (the caller) already has to do the "two-step" in C++17 — in
fact they've had to do it since C++98 — and the need to do it doesn't go
away in C++20. (The caller can now get away with skipping the two-step in
more cases, but only if they trust their coworkers never to change stuff at
a distance in a way that breaks their shortcut.)  From *your *point of view
as the *implementor *of QtPair, you don't have to do anything special;
C++20 hasn't added any new functionality for the implementor. C++20 merely
added a new *optional shortcut* for *callers *willing to trade
maintainability for one line of code savings.

–Arthur
-- 
SG10 mailing list
[email protected]
https://lists.isocpp.org/mailman/listinfo.cgi/sg10

Reply via email to