I'm just testing the new container-anti-pattern check and I get false positives for code like: Q_FOREACH ( int id, someMap.keys() ) { .... } and someMap.keys().toSet() I believe these are both false positives Reproducible: Always
Your first example allocates once (due to keys() call), and it should allocate 0. Use instead: for (auto it = someMap.cbegin(), end = someMap.cend(); it != end; ++it) Your second example allocates twice (due to keys call) and it should allocate once, construct the set manually instead. This is what happens when you call keys(): template <class Key, class T> Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::keys() const { QList<Key> res; res.reserve(size()); const_iterator i = begin(); while (i != end()) { res.append(i.key()); ++i; } return res; } You would be iterating twice instead of iterating the map directly. I can update the README and make it more clear.
Ah, ok. I get it now... Thanks for the pointers!