我想返回一个对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);
答案 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()相同。
这还将返回值的副本,而不是引用。但是由于您的地图是非常量的,因此不会使用此重载。