QHash/QMap: don't return const from value(), key()

... it breaks move semantics.

We can change these, since they're templates and a short survey shows
that no-one in Qt was crazy enough to inherit an exported class from
QHash or QMap.

Otherwise this would be BiC on MSVC, which encodes the return type.

There's also no safety benefit here, as none of the overloads returns
by reference, so users cannot expect map.value(key).mutate() to have
an effect on the element in the container.

In this, key() and value() differ from op[], which also returns const,
but whose overload returns a reference. op[] is therefore not proposed
here.

[ChangeLog][QtCore][QHash/QMultiHash/QMap/QMultiMap] The value() and
key() member functions now return T (was: const T), enabling move
semantics on their return values.

Change-Id: I0e5f53f9834caad458e3bde27f1daacbb4bac71b
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Marc Mutz 2019-07-08 21:25:55 +02:00
parent dfaca09e85
commit bd84e8d63e
4 changed files with 15 additions and 15 deletions

View File

@ -1449,7 +1449,7 @@ uint qHash(long double key, uint seed) noexcept
\sa count(), QMultiHash::contains()
*/
/*! \fn template <class Key, class T> const T QHash<Key, T>::value(const Key &key) const
/*! \fn template <class Key, class T> T QHash<Key, T>::value(const Key &key) const
Returns the value associated with the \a key.
@ -1461,7 +1461,7 @@ uint qHash(long double key, uint seed) noexcept
\sa key(), values(), contains(), operator[]()
*/
/*! \fn template <class Key, class T> const T QHash<Key, T>::value(const Key &key, const T &defaultValue) const
/*! \fn template <class Key, class T> T QHash<Key, T>::value(const Key &key, const T &defaultValue) const
\overload
If the hash contains no item with the given \a key, the function returns

View File

@ -298,10 +298,10 @@ public:
T take(const Key &key);
bool contains(const Key &key) const;
const Key key(const T &value) const;
const Key key(const T &value, const Key &defaultKey) const;
const T value(const Key &key) const;
const T value(const Key &key, const T &defaultValue) const;
Key key(const T &value) const;
Key key(const T &value, const Key &defaultKey) const;
T value(const Key &key) const;
T value(const Key &key, const T &defaultValue) const;
T &operator[](const Key &key);
const T operator[](const Key &key) const;
@ -631,7 +631,7 @@ Q_INLINE_TEMPLATE QHash<Key, T> &QHash<Key, T>::operator=(const QHash &other)
}
template <class Key, class T>
Q_INLINE_TEMPLATE const T QHash<Key, T>::value(const Key &akey) const
Q_INLINE_TEMPLATE T QHash<Key, T>::value(const Key &akey) const
{
Node *node;
if (d->size == 0 || (node = *findNode(akey)) == e) {
@ -642,7 +642,7 @@ Q_INLINE_TEMPLATE const T QHash<Key, T>::value(const Key &akey) const
}
template <class Key, class T>
Q_INLINE_TEMPLATE const T QHash<Key, T>::value(const Key &akey, const T &adefaultValue) const
Q_INLINE_TEMPLATE T QHash<Key, T>::value(const Key &akey, const T &adefaultValue) const
{
Node *node;
if (d->size == 0 || (node = *findNode(akey)) == e) {
@ -679,13 +679,13 @@ Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::keys(const T &avalue) const
}
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE const Key QHash<Key, T>::key(const T &avalue) const
Q_OUTOFLINE_TEMPLATE Key QHash<Key, T>::key(const T &avalue) const
{
return key(avalue, Key());
}
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE const Key QHash<Key, T>::key(const T &avalue, const Key &defaultValue) const
Q_OUTOFLINE_TEMPLATE Key QHash<Key, T>::key(const T &avalue, const Key &defaultValue) const
{
const_iterator i = begin();
while (i != end()) {

View File

@ -704,7 +704,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
\sa count(), QMultiMap::contains()
*/
/*! \fn template <class Key, class T> const T QMap<Key, T>::value(const Key &key, const T &defaultValue) const
/*! \fn template <class Key, class T> T QMap<Key, T>::value(const Key &key, const T &defaultValue) const
Returns the value associated with the key \a key.

View File

@ -364,8 +364,8 @@ public:
T take(const Key &key);
bool contains(const Key &key) const;
const Key key(const T &value, const Key &defaultKey = Key()) const;
const T value(const Key &key, const T &defaultValue = T()) const;
Key key(const T &value, const Key &defaultKey = Key()) const;
T value(const Key &key, const T &defaultValue = T()) const;
T &operator[](const Key &key);
const T operator[](const Key &key) const;
@ -630,7 +630,7 @@ QT_WARNING_PUSH
QT_WARNING_DISABLE_CLANG("-Wreturn-stack-address")
template <class Key, class T>
Q_INLINE_TEMPLATE const T QMap<Key, T>::value(const Key &akey, const T &adefaultValue) const
Q_INLINE_TEMPLATE T QMap<Key, T>::value(const Key &akey, const T &adefaultValue) const
{
Node *n = d->findNode(akey);
return n ? n->value : adefaultValue;
@ -979,7 +979,7 @@ Q_OUTOFLINE_TEMPLATE QList<Key> QMap<Key, T>::keys(const T &avalue) const
}
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE const Key QMap<Key, T>::key(const T &avalue, const Key &defaultKey) const
Q_OUTOFLINE_TEMPLATE Key QMap<Key, T>::key(const T &avalue, const Key &defaultKey) const
{
const_iterator i = begin();
while (i != end()) {