增加迭代器超出范围

qua*_*ell 6 c++

将随机访问迭代器增加到超出范围是不合法的吗?事实证明,Vector的C++实现会触发调试断言.

std::vector<int> foo(5);
auto iter = foo.begin();
iter += 10;
Run Code Online (Sandbox Code Playgroud)

只要不评估内存位置,这应该是指针合法的.

编辑:显然即使使用指针它也是非法的.

Jam*_*nze 5

这是未定义的行为。都带有迭代器和指针。使用\niterators,你可能会遇到断言失败,至少在\niterator 调试打开的情况下是如此。对于指针,它在大多数现代体系结构中可能不会执行任何操作,但在某些机器上它可以触发陷阱。您不必访问内存位置本身,只需创建指针即可发生未定义的行为。

\n\n

编辑:

\n\n

从标准(\xc2\xa75.7/5,添加了强调):

\n\n
\n

当具有整型类型的表达式与指针相加或相减时,结果具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向相对于原始元素的元素偏移量,使得结果和的下标之差\n原始数组元素等于积分表达式。换句话说,如果表达式 P 指向数组对象的第 i 个元素,则表达式 (P)+N (等效于 N+(P))和 (P)-N (其中 N\n其值 n) 分别指向数组对象的第 i + n 个和 i \xe2\x88\x92 n 个\n 元素(前提是它们存在)。此外,如果表达式 P 指向数组对象的最后一个元素,则表达式 (P)+1 指向数组对象的最后一个元素后一位,并且如果表达式 Q 指向最后一个元素后一位数组对象的元素,表达式 (Q)-1 指向数组对象的最后一个元素。如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则求值不会产生溢出;否则,行为\n 是未定义的

\n
\n\n

随机访问迭代器(唯一支持加法的迭代器)的相应规则分布在几个部分:运算符是+=根据重复定义的++(对于语义来说,需要具有恒定的时间复杂度),并且++要求\n“pre: r 是可解引用的。post: r 是可解引用的或者 r\nis 已经到了末尾。” (来自输入迭代器的定义,前向迭代器继承了前向迭代器,双向迭代器继承了双向迭代器,随机访问迭代器继承了前向迭代器)。

\n