你应该使用std :: unordered_map迭代器的引用吗?

时间:2015-12-14 14:35:36

标签: c++ c++11 for-loop reference

我正在调试一个开源游戏中的崩溃,而且违规行似乎是这样的:

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时,我们是否应该只使用迭代器的值而不是引用?

1 个答案:

答案 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引用修改值无法编译。