繁体   English   中英

C++值初始化向量迭代器比较

[英]C++ value initialized vector iterator comparison

c++17 中的以下代码是否合法?

std::vector<int> x{1,2,3};
std::vector<int>::iterator it{};
bool result = x.begin() != it;

以下引自https://en.cppreference.com/w/cpp/named_req/ForwardIterator

相等和不等比较是在相同底层序列的所有迭代器和值初始化迭代器上定义的

如果我理解正确的话,比较应该没问题。 它似乎适用于 clang 和 gcc,但是当我在调试模式下使用 MSVC 2019 运行它时,我得到一个断言说“向量迭代器不兼容”。

我不是在询问比较的结果,我只对 MSVC 是否符合此处的标准感兴趣。

Godbolt上的实时示例

MSVC 符合要求。

只有同一序列的迭代器通常可以相互比较。 值初始化的迭代器被认为是相同空序列的迭代器。 该“虚拟”空序列与任何其他序列不同,并且未(必须)定义跨单独序列的比较,因此该示例可能未定义。

标准报价(最新草案)

[forward.iterators] 前向迭代器的 == 域是相同底层序列上的迭代器的域。 但是,值初始化的迭代器可以进行比较,并且应该与相同类型的其他值初始化的迭代器进行比较。 [注意:值初始化的迭代器表现得好像它们引用了同一个空序列的末尾。 ——尾注

向量迭代器不能保证实现比这更宽的域的比较。 如果没有,则行为未定义。 您的比较不在此域范围内。

Visual Studio 是正确的。 您正在获得一个断言(仅在调试中!),因为您的代码具有未定义的行为,并且实现正在警告您。

值初始化的迭代器只能与其他值初始化的迭代器进行比较。 这是比较指针或迭代器仅适用于序列或数组的规则的概括(一个值得注意的例外是std::less ,它方便地提供整个 memory 空间的总排序;这是集合的唯一方法,使用默认比较器,不相关的指针可以工作)。

[forward.iterators] 前向迭代器的 == 域是相同底层序列上的迭代器的域。 但是,值初始化的迭代器可以进行比较,并且应该与相同类型的其他值初始化的迭代器进行比较。 [注意:值初始化的迭代器表现得好像它们引用了同一个空序列的末尾。 ——尾注]

没有为值初始化迭代器和序列中 position 的迭代器之间的排序定义语义。

在这方面,cppreference 文本的措辞有点糟糕,尽管同一页面在语义上确实做得更好,以实现两个单数迭代器之间的成功相等:

值初始化的LegacyForwardIterator的行为类似于某个未指定空容器的结束迭代器:它与相同类型的所有值初始化的 LegacyForwardIterator 进行比较。

而且,你不能将迭代器与不同的容器进行比较,所以我们有我们的规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM