C++ QMap::对临时对象的值返回引用
我想返回QMap值的常量引用。据我所知,QMap的特殊之处在于,如果您试图访问一个不存在的键,它将使用默认构造函数创建一个值并返回它。但如果我仍然理解正确,引用将是临时的,因此我得到警告 我有一段代码:C++ QMap::对临时对象的值返回引用,c++,qt,qmap,C++,Qt,Qmap,我想返回QMap值的常量引用。据我所知,QMap的特殊之处在于,如果您试图访问一个不存在的键,它将使用默认构造函数创建一个值并返回它。但如果我仍然理解正确,引用将是临时的,因此我得到警告 我有一段代码: const T &getSelectionDesc(QListWidgetItem *item) { if (!indexes.contains(item)) indexes.insert(item, T(item->text())); return
const T &getSelectionDesc(QListWidgetItem *item)
{
if (!indexes.contains(item))
indexes.insert(item, T(item->text()));
return indexes.value(item);
}
如您所见,我已经确保键返回了一些内容,我在第一次需要时创建了对象,然后将其保存在QMap中以供将来使用
尽管如此,我还是得到了警告,我应该在这里做些什么来纠正这种行为
编辑:
以下是我如何定义索引的方法:
QMap<QListWidgetItem *, T> indexes;
QMap索引;
这是我得到的警告:
在“const T&SelectListDialog::getSelectionDesc(QListWidgetItem*)[with T=BackgroundDesc]”的实例化中:
警告:正在返回对临时[-Wreturn local addr]的引用
返回索引。值(项)
根据报告:
const T QMap::value(const Key&Key,const T&defaultValue=T())const
请注意,返回类型为const T
,不是引用。这意味着返回索引。value(item)
将从QMap返回值的副本,而不分配引用。函数作用域一退出,复制的对象就被销毁——它是一个临时对象。这解释了您将收到的“引用临时”警告
在您的特定情况下,请使用。非常量重载返回对类型T
的引用。从文档中:
T&QMap::operator[](常量键和键)
你说得对
QMap的特殊之处在于,如果您试图访问一个不存在的键,它将使用默认构造函数创建一个值并返回它
但是,由于您已经在检查以确保密钥项
存在于您的QMap中,因此您可以保证密钥项
存在。因此,您可以(应该)将return
语句更改为:
return indexes[item];
请注意,对于
const QMap
s,下标运算符将默认为重载运算符:
const T QMap::operator[](const Key&Key)const
与()相同
这还会返回值的副本,而不是引用。但是,由于您的地图是非常量的,因此不会使用此重载。向我们显示确切的警告和
索引的声明。
?@Holt在OPAlright中添加了它,它正在工作,非常感谢,我真的认为使用value是实现这一点的方法……好吧,Qt建议.value()
如果键
不存在,并且您不希望创建另一个键值实例。但在本例中,您已经在创建键值实例,即使它在地图中还不存在。因此,下标是解决问题的方法。:-)谢谢你的解释