为什么 VC++ 中有“表达式:在开始之前无法递减双端队列迭代器”的运行时断言?

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++ ...

即使我们没有寻找或取消引用迭代器的值,为什么它会将其视为运行时错误?

Nat*_*son 5

从命名需求LegacyBi DirectionIterator的描述中:

--container.begin()开始迭代器不可递减,并且如果计算则行为未定义。

请注意,仅当取消引用时,行为才不是未定义的--container.begin()。简单地尝试减少开始迭代器是未定义的行为。

根据双向迭代器的标准,以下前提条件适用于--r何时r是双向迭代器:

s前提条件:存在r == ++s.

没有这样的sfor dq.begin(),因此递减它是未定义的行为。