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