[Development] qMoveToConst helper for rvalue references to movable Qt containers?
Giuseppe D'Angelo
giuseppe.dangelo at kdab.com
Wed Oct 31 10:47:56 CET 2018
Il 29/10/18 12:43, Olivier Goffart ha scritto:
> Deprecating means you will force user to port all their codebase away from it,
> which is a huge work. If the rationale is just that they will save a couple of
> atomic operations, i do not think it is worth it.
>
> Deprecating it only for non-shared container seems more logical, since we then
> warn only when there is actually a problem.
>
> And for the Qt shared container case, using foreach is less typing, but also
> less error prone. (do i have to use qAsConst? or make a copy? or even return a
> const object which even lead to more problems)
Not really, my main argument is teachability. I want to stop teaching
foreach to Qt users (which are also C++ users; why do we keep forgetting
that there's a C++ world out there that doesn't use Qt?), and tell them that
* foreach is supposed to be used only on Qt containers, not STL / Boost ones
* actually, only on _certain_ Qt containers,
* but if you use it on a "wrong" container it still works, no warnings
or anything, just a tremendous price hit,
* why? because it's unconditionally doing a copy, which is cheap only
for the certain containers in Qt,
* and because of this copy it can't do mutating iteration, so you need
to learn ranged-based for *anyhow*,
* but thanks to this copy it is perfectly safe to modify the original
container, because it's copied anyhow (and you can rely on it) (and
documentation was encouraging this) (and Qt's OWN SOURCE CODE had places
that relied on that) ---
Well, no. :(
I want to teach users:
* if you have a container and you want to do mutating iteration, use
for (auto &element : container)
* if you have a container and you want to do non-mutating iteration, use
for (const auto &c = container; const auto &element : c)
And that's it; this is a pure C++ solution that works for any container
(Qt, STL, Boost, ...), does never take any copy (you're iterating on the
original), it is const-correct (can't accidentally modify the container
through the element in a non-mutating iteration, can't accidentally
modify a const container), never detaches a Qt container unless you need
to anyhow (mutating iteration), and in general it is not safe to modify
the container's structure from within the loop's body so don't do it.
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/20181031/7102822b/attachment.bin>
More information about the Development
mailing list