gpt4 book ai didi

c++ - QMap::value 返回临时引用

转载 作者:搜寻专家 更新时间:2023-10-31 00:51:47 24 4
gpt4 key购买 nike

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

我有这段代码:

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

如您所见,我已经确保 key 返回一些东西,我在第一次需要它时创建对象,然后将它保存在 QMap 中以供别有用心。

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

编辑:

这是我定义索引的方式:

QMap<QListWidgetItem *, T> indexes;

这是我收到的警告:

In instantiation of 'const T& SelectListDialog::getSelectionDesc(QListWidgetItem*) [with T = BackgroundDesc]':

warning: returning reference to temporary [-Wreturn-local-addr]

return indexes.value(item);

最佳答案

根据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 is special in that if you try to access a key that does not exist, it will create a value with the default constructor and return it.

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

return indexes[item];

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

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

Same as value().

这也会返回值的拷贝而不是引用。但是由于您的 map 是非常量的,因此不会使用此重载。

关于c++ - QMap::value 返回临时引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54133803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com