使用qAsConst遍历QMap keys触发已删除函数错误的解决问询
问题分析与解决
错误原因
你遇到的编译错误,核心是qAsConst的右值重载被Qt主动删除了。m_myMap.keys()会返回一个临时的QList右值,而qAsConst是设计用来处理左值(比如已存在的容器对象),将其转为const引用防止意外修改。给右值套qAsConst完全没必要,Qt直接禁用了这个用法,所以触发了“已删除函数”的错误。
至于去掉qAsConst后的警告,是因为keys()方法会创建一个包含所有键的临时QList副本,属于没必要的额外内存分配,编译器提醒你可以优化。
解决方案
要同时消除错误和警告,核心是避免创建临时键列表,直接遍历QMap本身即可,有几种简洁的写法:
方法1:C++17结构化绑定(推荐)
直接遍历QMap的键值对,提取键来使用,完全不会生成临时容器:
for (const auto &[id, /* 不需要value可留空或用下划线占位 */] : m_myMap) { // 执行不影响m_myMap的操作 }
方法2:遍历键值对取键(兼容C++11及以上)
如果项目还没用到C++17,就显式从键值对中取键:
for (const auto &keyValuePair : m_myMap) { const auto &id = keyValuePair.first; // 执行不影响m_myMap的操作 }
方法3:使用const迭代器遍历
这是更传统的Qt容器遍历方式,同样不会生成临时容器:
for (auto it = m_myMap.cbegin(); it != m_myMap.cend(); ++it) { const auto &id = it.key(); // 执行不影响m_myMap的操作 }
这些写法都不会创建临时的QList,自然也就消除了“不必要的临时容器”警告,同时避开了qAsConst的错误用法。
内容的提问来源于stack exchange,提问作者TSG
相关产品推荐
相关产品推荐

