https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112349

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2023-11-02
             Status|UNCONFIRMED                 |NEW

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Ted Lyngmo from comment #0)
> auto& __tmp = *__first;

That won't compile for a move_iterator or a proxy reference. I think auto&&
would be OK.

But we'd need to restore the value category:

        auto __result = *__first;
        while (++__first != __last)
          {
            auto&& __tmp = *__first;
            if (std::__invoke(__comp,
                              std::__invoke(__proj, __result),
                              std::__invoke(__proj, __tmp)))
              __result = std::forward<decltype(*__first)>(__tmp);
          }
        return __result;

> ...or just supplying `*__first` to `std::__invoke` it doesn't do copies in
> OP's example but it may have other consequences. Worth looking in to anyway.

I think that would be OK too.

        auto __result = *__first;
        while (++__first != __last)
          {
            if (std::__invoke(__comp,
                              std::__invoke(__proj, __result),
                              std::__invoke(__proj, *__first)))
              __result = *__first;
          }
        return __result;

Reply via email to