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

Log*_*uff 4 c++ iterator visual-studio-2013

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

我正在使用Visual Studio 2013,并且已FAIL定义我的调试断言失败!- 矢量迭代器不兼容.是否有可能从右到左评估病情?我无法克服它.

这是一个(执行不佳)代码,它可以重现我的问题 - vec用第1和第2个元素替换第3和第4 个元素vec_second:

#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 << " ";
}
Run Code Online (Sandbox Code Playgroud)

但在Coliru的GCC上运行良好.

asc*_*ler 7

if((it = vec.erase(it, it + vec_second.size())) == vec.end())
Run Code Online (Sandbox Code Playgroud)

由于它们之间没有顺序点,编译器是免费的来电erase,并end以任何顺序.如果end首先调用,那么迭代器会立即失效erase,从而导致未定义的行为.

您的#ifndef FAIL代码是安全的方法.