On Mon, Jun 8, 2020 at 9:22 PM Ville Voutilainen via Core <core@lists.isocpp.org> wrote:
On Tue, 9 Jun 2020 at 03:55, Peter Dimov <pdimov@gmail.com> 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{ 12 };
  // return get<0>( tp ); // fails to compile
}

int succeed()
{
  QtPair tp{ 12 };
  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