iam*_*ind -1 c++ iterator deque visual-c++ language-lawyer
void foo (std::deque<Class>& dq)
{
auto it = dq.begin();
--it; // <--- asserts in VC++
...
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是一个过于简化的版本,但类似的情况也发生在我的代码中。它在 Ubuntu/Linux 中运行良好,但在 Visual Studio 中断言和中止程序。
表达式:无法在开始之前递减双端队列迭代器
有关程序如何导致断言失败的信息,请参阅 VC++ ...
即使我们没有寻找或取消引用迭代器的值,为什么它会将其视为运行时错误?
从命名需求LegacyBi DirectionIterator的描述中:
--container.begin()
开始迭代器不可递减,并且如果计算则行为未定义。
请注意,仅当取消引用时,行为才不是未定义的--container.begin()
。简单地尝试减少开始迭代器是未定义的行为。
根据双向迭代器的标准,以下前提条件适用于--r
何时r
是双向迭代器:
s
前提条件:存在r == ++s
.
没有这样的s
for dq.begin()
,因此递减它是未定义的行为。