0

我的程序的一部分是这样的:

#include <unordered_set>
#include <unordered_map>

std::unordered_map<std::string, int> G{{"1", 10}};

int m(const std::string& i, std::unordered_set<std::string>& v) {
    v.erase(i);
    return G.at(i);
}

int main() {
    std::unordered_set<std::string> v {"1"};
    const std::string& remove_this = *v.begin();
    return m(remove_this, v);
}

该程序应该可以在 linux 和 windows 之间移植。当使用 g++ 编译时,程序运行良好并返回 10,正如预期的那样。但是,当使用 VS 2017 编译时,程序中止,抛出 std::out_of_range。通过最简单的调试工作,我看到iin 函数m在调用G.at. (都没有优化)

据我了解,对 const 的引用v.begin()应该在返回之前过期m(g++ 案例)。但它的 MSVC 显然不同意这一点。

这个未定义的行为或实现是否已定义?实际上,由 const 引用传递的参数什么时候过期呢?

4

1 回答 1

1

争论i一直持续到m结束。但是,i引用的对象在 之后消失v.erase(i)i成为悬空引用。G.at(i)然后从导致未定义行为的悬空引用中读取。

于 2017-05-15T16:07:16.673 回答