10

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

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

3 回答 3

12

在这种情况下,如果元素不存在,const我们就无法将其添加到地图中,因此将返回一个本地对象。const

否则,在非const情况下,将使用指定的键(如果还没有键)创建一个元素,然后返回对它的引用。

于 2013-08-29T06:49:42.160 回答
0

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

于 2013-08-29T07:55:33.193 回答
0

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

于 2020-07-10T11:59:54.933 回答