QMap :: value返回对临时

时间:2019-01-10 17:16:27

标签: c++ qt qmap

我想返回一个对QMap值的const引用。据我了解,QMap的特殊之处在于,如果您尝试访问不存在的键,它将使用默认构造函数创建一个值并返回它。但是,如果我仍然理解正确,那么引用将是临时的,因此我得到警告。

我有这段代码:

const T &getSelectionDesc(QListWidgetItem *item)
{
    if (!indexes.contains(item))
        indexes.insert(item, T(item->text()));
    return indexes.value(item);
}

如您所见,我已经确保键返回了一些信息,我在第一次需要该对象时创建了该对象,然后将其保存在QMap中供其他用途。

尽管如此,我仍然收到警告,我应该在此处更改以纠正此行为吗?

编辑:

这是我定义indexes的方式:

QMap<QListWidgetItem *, T> indexes;

这是我得到的警告:

  

实例化“ const T&SelectListDialog :: getSelectionDesc(QListWidgetItem *)[with T = BackgroundDesc]”:

     

警告:返回对临时[-Wreturn-local-addr]的引用

     

返回index.value(item);

1 个答案:

答案 0 :(得分:4)

根据documentation of QMap::value()

  

const T QMap::value(const Key &key, const T &defaultValue = T()) const

请注意,返回类型为const T,它不是引用。这意味着return indexes.value(item)将从QMap返回值的副本,而不分配引用。一旦退出功能范围,复制的对象就会被销毁-它是一个临时对象。这解释了您收到的“对临时参考”警告。

在特定情况下,请改用subscript operator。非常量重载返回对类型T的引用。从文档中:

  

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

您已经正确地说了

  

QMap的特殊之处在于,如果您尝试访问不存在的键,它将使用默认构造函数创建一个值并返回它。

但是,由于您已经在检查QMap中是否存在键item,因此可以保证键item存在。因此,您可以(应该)将return语句更改为:

return indexes[item];

请注意,对于const QMap,下标运算符将默认为重载运算符:

  

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

     

value()相同。

这还将返回值的副本,而不是引用。但是由于您的地图是非常量的,因此不会使用此重载。