英文:
Use of deleted function error with qAsConst
问题
我正在编写一个简单的循环,它遍历了一个 QMap 中的键,如下所示:
for (const auto &id : qAsConst(m_myMap.keys())) {
// 做一些不影响 m_myMap 的操作
}
编译这个循环会生成一个错误:
使用已删除的函数 'void qAsConst(const T&&)[with T=QList
]'
如果没有使用 qAsConst,我会得到以下错误:
分配了不需要的临时容器。
我以为使用 qAsConst 的整个目的是避免创建临时容器。但我不理解这个错误信息 - 为什么它会调用一个已删除的函数?我该如何修复这个错误/警告?
英文:
I'm writing a simply loop which iterates through the keys in a QMap as show below:
for (const auto &id: qAsConst(m_myMap.keys())) {
// Do something which does not affect m_myMap
}
Compiling the loop generates an error:
> use of deleted function 'void qAsConst(const T&&)[with
> T=QList<QUUid>]'
Without the qAsConst I get the error:
> Allocating an unneeded temporary container.
I thought the whole point of qAsConst was to avoid creating the temporary container. But I don' understand the message - why is it calling a deleted function? How do I fix this to get rid of the error / warning?
答案1
得分: 2
这意味着您出于毫无理由的情况下创建了一个容器,使用此语句:m_myMap.keys()
。qAsConst()
并不能防止不必要的分配。const T& QMap::const_iterator::operator*() const
返回一个值,无法使用带键的范围循环。
请使用以下通常的循环方式:
for (auto it = m_myMap.begin(); it != m_myMap.end(); ++i) {
// it->key();
}
第一个答案是错误的。
for (const auto& [id, value]: m_myMap) {
// 执行一些不影响 m_myMap 的操作
}
英文:
It means that you create a container with this statement: m_myMap.keys()
for no good reason. qAsConst()
does not prevent the unneeded allocations. const T& QMap::const_iterator::operator*() const
returns a value, the range-loop with keys cannot be used.
Use a usual loop like below
for (auto it = m_myMap.begin(); it != m_myMap.end(); ++i) {
// it->key();
}
The first my answer is wrong.
for (const auto& [id, value]: m_myMap) {
// Do something which does not affect m_myMap
}
答案2
得分: 2
QMap::keys()
返回一个 QList,按值传递。
qAsConst
不能应用于这个右值,因为它的生命周期在 qAsConst
返回时结束。这是故意阻止的,所以你会得到有关已删除函数的错误。
一个解决方案是使用一个临时变量:
const auto ids = m_myMap.keys();
for (auto &id: ids) {
....
现在 keys
已经是 const,所以 const
或 qAsConst
都是多余的,它已经是这样了。
请注意,使用 const 迭代器会更高效,避免每轮都进行 O(log n) 的 QMap 查找。
英文:
QMap::keys()
returns a QList by value.
qAsConst
can't be applied to this rvalue because its lifetime ends when qAsConst
returns. This is why this is prevented on purpose, and you get that error about deleted function.
A solution is to use a temp variable:
const auto ids = m_myMap.keys();
for (auto &id: ids) {
....
Now keys
is const already, so const
or qAsConst
would be redundant, it's already so.
Note that using a const iterator would be more efficient, avoiding O(log n) QMap lookup every round.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论