[Development] Proposal: Deprecating platforms in Qt 5.6 that don't support lambda

Marc Mutz marc.mutz at kdab.com
Wed Dec 16 15:01:23 CET 2015


On Friday 20 February 2015 02:26:25 Thiago Macieira wrote:
> Do NOT do this. This will crash:
> 
>         for (auto const &item : std::cref(somefunction()) { ... }

Sorry for warming up an old thread, but since there was talk about the QtC 
coding style recommending this...

It's safe for lvalues. What't not safe are rvalues, but the std:.cref() 
overload from rvalues (const) is supposed to be deleted, according o en-
cppreference.com, so it shouldn't even compile. Doesn't help much if the 
compiler doesn't know = delete, though.

This might work, based on the cref() overload pattern:

      template <typename T>
      class QContainerWrapper {
          T container;
          friend decltype(auto) begin(const QContainerWrapper &w)
              Q_DECL_NOEXCEPT_EXPR(noexcept(w.container.begin()))
          { return w.container.begin(); }
          friend decltype(auto) end(const QContainerWrapper &w)
              Q_DECL_NOEXCEPT_EXPR(noexcept(w.container.end()))
          { return w.container.end(); }
      };
      // assume the following are friends of QContainerWrapper<T/T&>, resp.:
      template <typename T>
      QContainerWrapper<T&> qAsConst(const T &t) // lvalue
          Q_DECL_NOTHROW
      { return {t}; } // stores reference
      template <typename T>
      QContainerWrapper<T> qAsConst(const T &&t)
          Q_DECL_NOEXCEPT_EXPR(std::is_nothrow_move_constructible_v<T>)
      { return {std::move(t)}; } // stores a copy

Untested!

Thanks,
Marc

-- 
Marc Mutz <marc.mutz at kdab.com> | Senior Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
Tel: +49-30-521325470
KDAB - The Qt Experts



More information about the Development mailing list