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

Is the expression `&(*some_vector.end())` well defined?

本文关键字:定义 some 表达式 vector end      更新时间:2023-10-16

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

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

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

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

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