在一些旧代码中找到了这个(简化版本),调试器(VC ++ 2015)在执行时没有抱怨无效的迭代器。
#include <iterator>
#include <set>
int main() {
std::set<int> s = {0,1,2,3,4};
auto it = std::begin(s);
while (it != std::end(s))
{
if (*it % 2 == 0)
s.erase(it++); // UB?
else
++it;
}
}
我知道它应该是it = s.erase(it);
,但我想知道这是否真的是未定义的行为。是,还是有什么东西可以使代码正常?
以下当然是未定义的:
s.erase(it);
++it
现在接下来就可以了:
auto temp = it;
++temp;
s.erase(it);
it = temp;
但是我的代码呢?
s.erase(it++);