Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QMap::对临时对象的值返回引用_C++_Qt_Qmap - Fatal编程技术网

C++ 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

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

我有一段代码:

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()
如果
不存在,并且您不希望创建另一个键值实例。但在本例中,您已经在创建键值实例,即使它在地图中还不存在。因此,下标是解决问题的方法。:-)谢谢你的解释