Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 您应该使用std::无序映射迭代器的引用吗?_C++_C++11_For Loop_Reference - Fatal编程技术网

C++ 您应该使用std::无序映射迭代器的引用吗?

C++ 您应该使用std::无序映射迭代器的引用吗?,c++,c++11,for-loop,reference,C++,C++11,For Loop,Reference,我目前正在调试一个开源游戏中的崩溃,令人不快的是: for( auto &special: special_attacks ) { 其中,特殊攻击定义如下: std::unordered_map<std::string, mon_special_attack> special_attacks; std::无序映射特殊攻击; 我怀疑这里的问题是,由于special是一个迭代器而不是一个值,因此此代码实际上可能正在创建对内部special\u攻击的返回值的引用。begin(

我目前正在调试一个开源游戏中的崩溃,令人不快的是:

for( auto &special: special_attacks ) {
其中,
特殊攻击
定义如下:

std::unordered_map<std::string, mon_special_attack> special_attacks;
std::无序映射特殊攻击;
我怀疑这里的问题是,由于
special
是一个迭代器而不是一个值,因此此代码实际上可能正在创建对内部
special\u攻击的返回值的引用。begin()
调用。忽略
会导致功能代码(修改
特殊。第二个
也会修改
无序映射中的副本)这一事实支持了这种怀疑

因此,当在
std::unordered_map
上迭代时,我们是否应该始终使用迭代器的值而不是引用

…因为special是迭代器而不是值

不,不是。
special\u攻击的值类型将是
std::pair
,因此
auto&special
将具有类型
std::pair&
(可能参考const)。这不是迭代器-您的bug在其他地方


根据您的描述,我怀疑
特殊_攻击
实际上是
常量
,因此您通过常量引用修改值的尝试无法编译。

re“special是迭代器”,不,不是。例如,它显示了一个示例实现,该实现将向您显示
特殊
(在您的案例中)不是迭代器。哦,你说得对,它只是一对。。天啊,汽车有时让我哑巴。现在特别奇怪的是,不使用引用仍然允许我修改容器中的值。啊。。没关系,我读错了调试输出。。我的错,是的,我的错。你不认为还有什么需要补充的吗?你的编辑:不,它编译得很好,只是崩溃了。。在迭代过程中似乎有什么东西在修改容器,这很奇怪,因为密钥总是作为常量提取。但是谢谢你。