为什么QMap :: operator [](const Key& key)按值返回?

时间:2013-08-29 06:28:40

标签: c++ qt c++11

我注意到QMap::operator[](const Key & key)有这两个overloads

    T & QMap::operator[](const Key & key)
const T QMap::operator[](const Key & key) const

是否有理由按价值返回?

因为我们已经移动了语义:

按值返回时,我们应该返回const值吗?

我问的原因是:

想象一下我们有:

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();
}

3 个答案:

答案 0 :(得分:11)

const情况下,我们无法向const地图添加元素(如果它尚不存在),因此将返回本地对象。

否则,在非const的情况下,在返回对它的引用之前,将使用指定的键创建一个元素(如果没有已经存在的那个)。

答案 1 :(得分:0)

我认为非引用const是为了确保客户端代码无法通过任何方式修改map。您知道如果使用const_cast<ExpensiveToCopy>map[4]或其他方式,我们仍然可以修改map[4],但此map[4]不能引用map的第4个元素。

答案 2 :(得分:0)

也不可能将const类型的Value类型存储起来,因为按值返回需要Value :: operator =()。在我看来,QMap :: operator []的const版本是构思错误的。通过调用contains()和at()可以产生相同的效果。这是一个便利功能的示例,很好,很不方便。