使用基于自动的Ranged for循环与使用基于Ranged for循环的对

时间:2017-09-17 21:55:53

标签: c++

在下面的代码中

#include <iostream>
#include<unordered_map>
#include<string>

int main()
{
    std::unordered_map<std::string,int>m;
    m["1"]=1;
    m["2"]=2;

    for(const std::pair<std::string,int>&p :m)
    {
        std::cout<<&p<<"\n";
        /*0x7fff5fbff068
          0x7fff5fbff068*/
    }

    for(const auto &p :m)
    {
        std::cout<<&p<<"\n";
        /*0x10061e410
         0x10061e3e0*/
    }

}

如果我使用基于正常对的ranged for循环,它会显示迭代的相同地址

0x7fff5fbff068
0x7fff5fbff068

然而,如果我使用auto,迭代的地址会发生变化

/*0x10061e410
  0x10061e3e0*/

为什么行为存在差异。即使在使用对的循环中,两者都应该显示不同的地址。

ranged for loop

之间有什么区别

1 个答案:

答案 0 :(得分:6)

嗯,这就是事情。你的两个循环不使用相同类型的元素。

map迭代器返回对std::pair<const std::string, int> 1 的引用。并且你的第一个循环构造了一个临时对象(因为你的std::string不是const限定的)。因此,您不会在第一个循环中在地图内打印该对的地址。

编译器巧妙地使用相同的存储来在每次迭代时构造临时对象并非不可能,因此您总是看到打印的地址相同。

<子> 1 不允许您通过迭代器修改密钥,请记住。它会搞乱地图不变量。