C++ 是表达式`&;(*some_vector.end())`定义良好?

C++ 是表达式`&;(*some_vector.end())`定义良好?,c++,pointers,undefined-behavior,C++,Pointers,Undefined Behavior,有时我需要将向量迭代器转换为指针。我知道有几种方法可以做到这一点,比如vector::data,但我很好奇&(*some_vector.end())的有效性。我知道取消对向量末尾的引用是未定义的行为,但似乎&运算符不需要表达式的值,因此在该表达式中不会实际取消对末尾迭代器的引用。对吗?或者这仍然是未定义的行为?取消引用迭代器的前提是它与结束迭代器不同。即使您对结果所做的只是获取其地址,它仍然是未定义的行为。取消对迭代器的引用的前提是它与结束迭代器不同。即使您对结果所做的只是获取其地址,它仍然是未

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

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

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

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

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

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

尝试
数据()+end()-begin()

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

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

*某些向量.end()
仍然尝试取消对end()的引用仍尝试取消对end()的引用