这个完美的程序在 Visual Studio 2013 的调试模式下失败了:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void main()
{
vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
for (auto iFrom = v.cbegin(), iTo = iFrom+5; iFrom != v.cend(); iFrom = iTo, iTo += 5)
cout << *max_element(iFrom, iTo) << '\n';
}
with vector iterator + offset out of range
断言失败。它失败了,因为iTo > v.cend()
,这在这里是无害的。调试器测试未取消引用的迭代器的值有什么意义?
顺便说一句,我知道我可以将上面的循环重写为:
for (auto i = v.cbegin(); i != v.cend(); i += 5)
cout << *max_element(i, i+5) << '\n';
但我试图用一段更复杂的现实代码制作一个简单的示例,其中计算新的迭代器值的计算成本很高。
我也意识到人是可以改变的_ITERATOR_DEBUG_LEVEL
值来影响此行为,但它会导致某些库的二进制版本出现问题,这些库是使用默认调试设置构建的。