[Development] qMoveToConst helper for rvalue references to movable Qt containers?
Giuseppe D'Angelo
giuseppe.dangelo at kdab.com
Sat Oct 20 18:53:22 CEST 2018
Il 20/10/18 14:43, Elvis Stansvik ha scritto:
> In our application we added a helper like
>
> template <typename T>
> const T moveToConst(T &&t)
> {
> return std::move(t);
> }
>
> that we use for these cases. It just moves the argument to a const
> value and returns it. With that we can do for (auto foo :
> moveToConst(returnsQtContainer()) { ... }.
>
> Since it's such a common pattern to want to iterate a returned Qt
> container, what would you think of having such a helper
> (qMoveToConst?) in Qt?
Possibly... Note however that such a thing was already proposed for
qAsConst itself, and shut down to avoid having qAsConst diverge from
std::as_const (and I approve of not having Qt-specific behaviours). I
can't find the relevant discussion on the mailing list right now.
For reference, std::as_const's original authors had doubts about the
lifetime issues around this, saying that more investigations were needed:
> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0007r0.html#9.0
After a LEWG meeting it was reworded like this:
> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0007r1.html#8.0
I'm not entirely sure of what prompted the change for as_const -- if
just a safety net while waiting for more investigation, or if something
more profound was raised.
I can easily imagine however a scenario where moveToConst() can lead to
worse code than the current solution.
Current solution:
// GCE may get applied, 0 moves
const QVector<Object> v = getVector();
for (auto &obj : v) ~~~
vs.
// Always 2 moves
for (auto &obj : qMoveToConst(getVector()) ~~~
And if the type is not even cheap to move (e.g. QVLA, std::array),
qMoveToConst becomes a really unpleasant surprise.
How about asking LEWG about their reasoning too?
My 2 c,
--
Giuseppe D'Angelo | giuseppe.dangelo at kdab.com | Senior Software Engineer
KDAB (France) S.A.S., a KDAB Group company
Tel. France +33 (0)4 90 84 08 53, http://www.kdab.com
KDAB - The Qt, C++ and OpenGL Experts
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4007 bytes
Desc: Firma crittografica S/MIME
URL: <http://lists.qt-project.org/pipermail/development/attachments/20181020/cf0475c1/attachment.bin>
More information about the Development
mailing list