【发布时间】:2020-10-23 21:50:45
【问题描述】:
我在实际的生产代码中发现了以下内容。 我怀疑它实际上具有未定义的行为,但是,我在 cppreference 上找不到相关信息。您能否确认这是 UB 或有效代码以及为什么这是 UB/有效(最好带有标准的引用)?
#include <vector>
int main(int, char **)
{
auto v = std::vector<int>({1,2,3,4,5});
auto begin = v.begin();
auto outOfRange = begin + 10;
auto end = v.end();
auto clamped = std::min(outOfRange, end);
return (clamped == end) ? 0 : 42;
}
如您所见,begin + 10 将创建一个超出std::vector 范围的迭代器。
但是,没有使用该迭代器,因为它使用std::min 进行了限制。
【问题讨论】:
-
我认为一旦你形成了一个超出结尾的迭代器,你就有了 UB,无论它是否被取消引用。这与指针相同,这对于迭代器来说很常见。
-
@underscore_d 所有这些答案都说它是 UB,但没有解释原因
-
那么我希望有人应该在我们已经提出的问题上发布一个更好的答案!
-
我现在投票关闭另一个作为此副本的副本,因为 Evg 的回答最终引用了标准。这应该是公认的答案。
标签: c++ stl iterator language-lawyer