条件中的迭代器赋值 - 向量迭代器不兼容

Iterator assignment in a condition - vector iterators incompatible

我有一个 std::vector 的包装器,我已经实现了用另一个向量替换一个向量中的部分的函数。 我试图将迭代器的赋值直接放在 if 条件中,但得到了意想不到的结果

我正在使用 Visual Studio 2013 并且定义了 FAIL 我得到 调试断言失败! - 向量迭代器不兼容。是否有可能从右到左评估条件?我无法克服它。

这是一个(实施不佳的)代码,它重现了我的问题 - 旨在用 vec_second 的第一个和第二个元素替换 vec 的第 3 个和第 4 个元素:

#include <iostream>
#include <vector>
#include <iterator>
using std::cout;

//#define FAIL

int main()
{
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> vec_second = {6, 7};

    auto it = vec.begin() + 2;

#ifndef FAIL
    it = vec.erase(it, it + vec_second.size());

    if(it == vec.end())
#else
    if((it = vec.erase(it, it + vec_second.size())) == vec.end())
#endif
        vec.reserve(vec.size() + vec_second.size());

    vec.insert(it, vec_second.begin(), vec_second.end());

    for(auto const& x : vec)
        cout << x << " ";
}

但在 Coliru's GCC 上运行良好。

if((it = vec.erase(it, it + vec_second.size())) == vec.end())

由于它们之间没有序列点,编译器可以自由调用 eraseend 中的任一顺序。如果 end 首先被调用,该迭代器会立即被 erase 无效,导致未定义的行为。

您的 #ifndef FAIL 代码是执行此操作的安全方法。