这是未定义的行为吗? (标准::设置::擦除(它++))

时间:2017-01-18 18:15:01

标签: c++

在一些旧代码中找到了这个(简化版本),调试器(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);,但我想知道这是否真的是未定义的行为。是,还是有什么东西可以使代码正常?

The documentation says "References and iterators to the erased elements are invalidated. Other references and iterators are not affected.""

以下当然是未定义的:

s.erase(it);
++it

现在接下来就可以了:

auto temp = it;
++temp;
s.erase(it);
it = temp;

但是我的代码呢?

s.erase(it++);

0 个答案:

没有答案