[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