[Development] Qt 5 types under consideration for deprecation / removal in Qt 6
Kevin Kofler
kevin.kofler at chello.at
Wed May 29 19:42:32 CEST 2019
Mutz, Marc via Development wrote:
> == QSharedDataPointer / QExplicitlySharedDataPointer ==
>
> These are basically Qt-internals, and should never have been public in
> the first place.
Why? They are essential to be able to implement one's own CoW types and thus
write idiomatic Qt code.
I use QSharedDataPointer a lot, and my code will likely be stuck on Qt 5 or
6 forever if they get removed resp. deprecated in Qt 6.
> == Q_FOREACH -> ranged for loops
> (https://codereview.qt-project.org/c/qt/qtbase/+/147363) ==
As I already wrote when Q_FOREACH was deprecated to begin with, the problem
is that this replacement is dangerous because ranged for does not copy (so
legacy code that accidentally changed the container, which was harmless with
Q_FOREACH, will crash and burn with ranged for) and can be inefficient with
CoW types if done carelessly because ranged for does not automatically
constify the container (whereas Q_FOREACH made a const copy).
> === related: Q_FOREVER -> for(;;) ===
This just reduces readability for no maintainability gain whatsoever.
> == Java-style iteration
> (https://codereview.qt-project.org/c/qt/qtbase/+/262344) ==
The Java-style iterators are much more convenient to use than the STL-style
ones, and quadratic loops can be accidentally written with both.
> == QScopedPointer -> std::unique_ptr ==
> == QLinkedList -> std::list
> == qHash() -> std::hash ==
> == MT plumbing ==
> === QAtomic -> std::atomic ===
> === QMutex / QReadWriteLock -> std::*mutex* ===
> === QMutexLocker -> std::unique_lock ===
> === QWaitCondition -> std::condition_variable(_any) ===
> == QQueue / QStack -> std::queue, std::stack ==
> == QSharedPointer / QWeakPointer -> std::shared_ptr/weak_ptr ==
> == QSet / QHash -> std::unordered_set/map ==
> == QMap -> std::map ==
All these have the same issue: You are proposing to deprecate Qt types in
favor of STL types, which have a different naming convention (_ vs. camel
case) and often terse, harder to understand names (e.g., ptr vs. Pointer,
push/pop for a queue vs. enqueue/dequeue, etc.), and which do not support
CoW (all the container types in your list), nor Java-style iterators, for
that matter.
I think Qt should keep striving for completeness and not require its users
to mix&match Qt and STL usage with all the STL's ugliness.
Kevin Kofler
(who thinks C++ is a great language except for its standard library)
More information about the Development
mailing list