【问题标题】:Which operations are defined for invalid iterators?为无效的迭代器定义了哪些操作?
【发布时间】:2015-10-12 08:00:45
【问题描述】:

作为a question concerning comparing invalid iterators 的后续行动,我试图在 C++ 标准中找到无效迭代器的允许表达式的定义。搜索“无效迭代器”仅在 §24.2.1.11 中找到一个引用。它说无效的迭代器可能是“单一的”,但仅说明取消引用它们可能是未定义的行为。没有给出进一步的语义。

最初的答案之一表明它是实现定义的行为,但我认为一般不能假设这是因为上述段落明确提到了 UB。

This answer 显示“对无效指针值的任何其他使用都具有实现定义的行为”。由于向量的迭代器通常被实现为指针,我认为比较两个无效的迭代器至少是实现定义的行为。

谁能指出标准中定义无效迭代器语义的相关部分?

【问题讨论】:

    标签: c++ vector stl language-lawyer


    【解决方案1】:

    也许 [iterator.requirements.general, 24.2.1]/6 包含您所追求的内容?

    大多数表达式的结果对于奇异值是未定义的; 唯一的例外是销毁包含奇异值的迭代器,分配非奇异值 值到持有奇异值的迭代器,并且对于满足DefaultConstructible 的迭代器 要求,使用值初始化的迭代器作为复制或移动操作的源。 [注:这 不为默认初始化提供保证,尽管区别仅对琐碎的类型很重要 默认构造函数,例如指针或持有指针的聚合。 — 尾注] 在这些情况下,单数 值被覆盖的方式与任何其他值相同。可取消引用的值总是非单数的。

    此外,无效的迭代器由第 11 段定义:

    invalid 迭代器是可以是单数的迭代器。

    因此,无效迭代器至少与奇异迭代器一样受到约束;具体来说,唯一允许的操作是销毁和赋值。

    【讨论】:

    • 也许,涉及一些推断。这定义了单数迭代器的语义,但我正在寻找无效迭代器的类似定义。 24.2.1/11 说无效迭代器可能是单数的,所以我可以得出结论,这是无效迭代器的语义,因为每个无效迭代器都必须符合单数迭代器。但是,它们可能不是单数。这是否意味着他们可以提供更多的操作?
    • @Jens:不。“无效迭代器”的定义是“可能是单数的迭代器”。因此,您对无效迭代器的保证最多是对单数迭代器的保证。
    猜你喜欢
    • 2022-12-31
    • 2017-09-09
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多