I noticed that the QMap::operator[](const Key & key) has these two overloads:
    T & QMap::operator[](const Key & key)
const T QMap::operator[](const Key & key) const
Is there a reason for returning by value?
And since we have move semantics:
when returning by value, should we ever return by const value?
The reason why I am asking is this:
Imagine we have:
class ExpensiveToCopy;
{
public:
    int someProperty() const;
    ...
}
void f(const QMap<int, ExpensiveToCopy>& map)
{
    int lala = map[4].someProperty(); // We need to copy the entire object
                                      // just to look at someProperty();
}