QMap::value return 参考临时
QMap::value return reference to temporary
我想 return 对 QMap 值的常量引用。据我所知,QMap 的特殊之处在于,如果您尝试访问一个不存在的键,它将使用默认构造函数创建一个值并 return 它。但如果我仍然理解正确,引用将是临时的,因此我会收到警告。
我有这段代码:
const T &getSelectionDesc(QListWidgetItem *item)
{
if (!indexes.contains(item))
indexes.insert(item, T(item->text()));
return indexes.value(item);
}
如你所见,我已经确定了关键 return 的东西,我在第一次需要它时创建对象,然后将它保存在 QMap 中以供别有用心。
尽管如此,我仍然收到警告,我应该在此处更改什么以纠正该行为?
编辑:
我是这样定义的 indexes
:
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
请注意 return 类型是 const T
并且不是引用。这意味着 return indexes.value(item)
将 return copy QMap 中的值,而不分配引用。一旦退出函数范围,复制的对象就会被销毁——它是一个临时对象。这解释了您收到的 "reference to temporary" 警告。
在您的特定情况下,请改用 subscript operator。非常量重载 return 是对类型 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
s,下标运算符将默认为重载运算符:
const T QMap::operator[](const Key &key) const
Same as value().
这也是 return 值的副本而不是引用。但是由于您的地图是非常量的,因此未使用此重载。
我想 return 对 QMap 值的常量引用。据我所知,QMap 的特殊之处在于,如果您尝试访问一个不存在的键,它将使用默认构造函数创建一个值并 return 它。但如果我仍然理解正确,引用将是临时的,因此我会收到警告。
我有这段代码:
const T &getSelectionDesc(QListWidgetItem *item)
{
if (!indexes.contains(item))
indexes.insert(item, T(item->text()));
return indexes.value(item);
}
如你所见,我已经确定了关键 return 的东西,我在第一次需要它时创建对象,然后将它保存在 QMap 中以供别有用心。
尽管如此,我仍然收到警告,我应该在此处更改什么以纠正该行为?
编辑:
我是这样定义的 indexes
:
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
请注意 return 类型是 const T
并且不是引用。这意味着 return indexes.value(item)
将 return copy QMap 中的值,而不分配引用。一旦退出函数范围,复制的对象就会被销毁——它是一个临时对象。这解释了您收到的 "reference to temporary" 警告。
在您的特定情况下,请改用 subscript operator。非常量重载 return 是对类型 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
s,下标运算符将默认为重载运算符:
const T QMap::operator[](const Key &key) const
Same as value().
这也是 return 值的副本而不是引用。但是由于您的地图是非常量的,因此未使用此重载。