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上运行良好.
if((it = vec.erase(it, it + vec_second.size())) == vec.end())
Run Code Online (Sandbox Code Playgroud)
由于它们之间没有顺序点,编译器是免费的来电erase,并end以任何顺序.如果end首先调用,那么迭代器会立即失效erase,从而导致未定义的行为.
您的#ifndef FAIL代码是安全的方法.
| 归档时间: |
|
| 查看次数: |
228 次 |
| 最近记录: |