我的程序的一部分是这样的:
#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。通过最简单的调试工作,我看到i
in 函数m
在调用G.at
. (都没有优化)
据我了解,对 const 的引用v.begin()
应该在返回之前过期m
(g++ 案例)。但它的 MSVC 显然不同意这一点。
这个未定义的行为或实现是否已定义?实际上,由 const 引用传递的参数什么时候过期呢?