我正在调试一个开源游戏中的崩溃,而且违规行似乎是这样的:
for( auto &special: special_attacks ) {
special_attacks
的定义如下:
std::unordered_map<std::string, mon_special_attack> special_attacks;
我怀疑这里的问题是,因为special
是一个迭代器而不是一个值,所以这段代码实际上可能正在创建对内部special_attacks.begin()
调用的返回值的引用。遗漏&
导致功能代码(修改special.second
也将修改unordered_map
中的副本)这一事实支持了这种怀疑。
因此,当迭代std::unordered_map
时,我们是否应该只使用迭代器的值而不是引用?
答案 0 :(得分:2)
...因为特殊是迭代器而不是值......
不,不是。 special_attacks
的值类型将为std::pair<const std::string, mon_special_attack>
,因此auto& special
将具有类型std::pair<const std::string, mon_special_attack>&
(可能引用const)。那不是迭代器 - 你的bug就在别的地方。
我怀疑基于您的描述special_attacks
实际上是const
,因此您尝试通过const引用修改值无法编译。