表达式'&(* some_vector.end())`定义得很好吗?

时间:2013-09-21 11:55:22

标签: c++ pointers undefined-behavior

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

2 个答案:

答案 0 :(得分:3)

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

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

虽然这可能很有趣,但是GCC使用签名溢出进行类似的优化,其中硬件做了一件事,但编译器假设没有发生任何未定义,并且它可以丢弃试图检测溢出的整个代码分支。

答案 1 :(得分:1)

解除引用迭代器的前提条件是它与结束迭代器不同。即使您对结果所做的只是取其地址,它仍然是未定义的行为。