为什么“L.insert(it--, i);” 与“L.insert(it, i); it--;”的行为不同吗?

LYF*_*Fer 4 c++ std

这是我在 C++11 标准下运行的两段代码。我预计迭代器的后递减会产生相同的效果,但是这两段代码产生完全不同的结果。我的理解哪里出了问题?

list<int> L;

int main() {    
    L.push_back(0);
    L.push_front(1);
    auto it = L.begin();
    for (int i = 2; i <= 5; i++) {
        L.insert(it--, i);
    }
    for (auto num : L) {
        printf("%d ", num);
    }
    // 2 5 0 4 1 3
}
Run Code Online (Sandbox Code Playgroud)
list<int> L;

int main() {    
    L.push_back(0);
    L.push_front(1);
    auto it = L.begin();
    for (int i = 2; i <= 5; i++) {
        L.insert(it, i);
        it--;
    }
    for (auto num : L) {
        printf("%d ", num);
    }
    // 5 4 3 2 1 0
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 7

L.insert(it, i);
it--;
Run Code Online (Sandbox Code Playgroud)

这会在 之前插入一个节点it,然后it向后移动到插入的节点。

L.insert(it--, i);
Run Code Online (Sandbox Code Playgroud)

操作顺序被交换:它在调用之前向后移动迭代器。 insert()没有可以移回的节点,因此会导致未定义的行为。