c++autovariable(map)被分配垃圾值

我尝试分配 'a' 变量如下:

for (auto& a : getMap()[1])

将垃圾值分配给a. 但是如果我在如下所示首先声明变量后使用它,它可以正常工作。

auto vv = getMap()[1];
    for (auto& a : vv)

如果我在没有声明变量的情况下立即使用它,为什么会出现问题?

#include <string>
#include <map>
#include <memory>
#include <vector>
using namespace std;

typedef struct _mystruct {

} mystruct;

map<int, vector<shared_ptr<mystruct>>> mymap;

void init() {
    vector<shared_ptr<mystruct>> v;
    v.push_back(make_shared<mystruct>(mystruct()));
    mymap[1] = v;
}

map<int, vector<shared_ptr<mystruct>>> getMap() {
    return mymap;
}

int main()
{
    init();

    vector<shared_ptr<mystruct>> v2;
    for (auto& a : getMap()[1]) {
        v2.push_back(a);
    }

    auto vv = getMap()[1];
    for (auto& a : vv) {
        v2.push_back(a);
    }

        return 0;
}

回答

在 C++17 之前(此后更改的详细信息不会更改答案),基于 for 循环的范围等效于(取自cppreference):

{    
    auto && __range = range_expression ;
    for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) {    
        range_declaration = *__begin;
        loop_statement   
    }    
}

因为您getMap返回了地图的副本,所以:

auto&& __range = getMap()[1];

是对地图临时副本中元素的引用,该元素在此语句结束时被销毁。__range然后持有一个悬空引用。无论如何,您可能不想复制整个地图只是为了迭代其中一个元素,返回(const)引用而不是从中的副本getMap将解决问题。

当你写:

auto vv = getMap()[1];

然后vv是地图中矢量的副本。因此,在这种情况下没有悬空参考。


以上是c++autovariable(map)被分配垃圾值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>