1

有时我需要将向量迭代器转换为指针。我知道有几种方法可以做到这一点,比如vector::data,但我很好奇&(*some_vector.end()). 我知道取消引用向量的结尾是未定义的行为,但似乎&运算符不需要表达式的值,因此结束迭代器实际上不会在此表达式中取消引用。那是对的吗?或者这仍然是未定义的行为?

4

2 回答 2

3

试试data()+end()-begin()

虽然vector迭代器可以实现为原始指针,但它们并非必须如此。如果它是迭代器,则取消引用迭代器是未定义的end,这意味着实际上可以在调试中检测迭代器以检测这种情况,并且编译器可以合法地假设您从不这样做。因此,根据标准,该语句&*it-&*begin() >= size()可以合法地被视为false.

虽然这可能很有趣,但 GCC 对有符号溢出进行了类似的优化,硬件只做一件事,但编译器假定没有发生任何未定义的事情,它可以丢弃试图检测溢出的整个代码分支。

于 2013-09-21T12:38:56.093 回答
1

取消引用迭代器的前提是它与结束迭代器不同。即使你对结果所做的只是获取它的地址,它仍然是未定义的行为。

于 2013-09-21T12:03:47.897 回答