【问题标题】:QMap::value return reference to temporaryQMap::value 返回对临时的引用
【发布时间】:2019-01-10 17:16:27
【问题描述】:

我想返回一个对 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] 的引用

返回索引.value(item);

【问题讨论】:

  • 告诉我们确切的警告和indexes的声明?
  • @Holt 添加到 OP 中

标签: c++ qt qmap


【解决方案1】:

根据documentation of QMap::value()

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

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

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

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

你说得对

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

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

return indexes[item];

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

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

value()。

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

【讨论】:

  • 好吧,它正在工作,非常感谢,我真的认为使用价值是去那里的方式......
  • 好吧,Qt 推荐.value(),以防key 不存在并且您不希望创建另一个键值实例。但在这种情况下,您已经在创建键值实例,即使它在地图中还不存在。所以下标是要走的路。 :-)
  • 非常感谢您的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多