【问题标题】:Equality comparison for Input iterators输入迭代器的相等比较
【发布时间】:2017-12-22 16:49:24
【问题描述】:

对于输入迭代器,如果其中一个迭代器已失效,比较相等性的要求是什么?

input_iter x = foo();
input_iter y = x;
++x;
return x == y;  // What must this return?

在上面的例子中,取消引用y 显然是未定义的,但是像这样的相等比较的结果是否已定义?阅读cppreference.com,绝对是两个输入迭代器必须比较true,如果它们实际上是相同的,因为输入迭代器必须满足EqualityComparable,但我实际上没有看到任何说明如果结果必须是什么相同。我是否可以总是operator== 返回true(与结束迭代器比较时除外)?

【问题讨论】:

  • 这似乎暗示你应该返回 false 如果它们不相等,但你是对的,它没有明确说明,这很奇怪。值得注意的是,x != y 被定义为等同于 !(x == y),所以这可能会迫使你在这里。

标签: c++ iterator input-iterator


【解决方案1】:

"对于输入迭代器,如果其中一个迭代器已经失效,比较相等性的要求是什么?"

没有。引用 ISO/IEC 14882:2003(E), [lib.input.iterators],

==在其域上的等价关系,(强调)
bool(a==b) != bool(a!=b) ==的域上(强调)

还有,

r [++r 之前] 的先前值的任何副本不再 ...在==的域中。

对于无效的输入迭代器,==!= 没有任何特殊行为。

【讨论】:

  • 要清楚,您是说标准没有定义问题中x==y 的行为?
  • 那么表达式是未指定行为还是未定义行为?
  • @M.M 这取决于input_iter 的确切类型。由于 OP 没有指定 input_iter 是什么,除了满足 [lib.input.iterators] 之外,行为可能已定义,也可能未定义。
猜你喜欢
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 2013-04-29
  • 2012-03-28
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多