Good post, but: >> * if you have a container and you want to do non-mutating iteration, use >> for (const auto &c = container; const auto &element : c)
This is enough: for (auto &element : std::as_const(container)) and for the rvalue reference case: for (const auto &c = container; auto &element : c) Philippe On Wed, 31 Oct 2018 10:47:56 +0100 Giuseppe D'Angelo via Development <development@qt-project.org> wrote: > 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.dang...@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 > _______________________________________________ Development mailing list Development@qt-project.org http://lists.qt-project.org/mailman/listinfo/development