【问题标题】:Assertion when using const_iterator [duplicate]使用 const_iterator 时的断言 [重复]
【发布时间】:2013-04-05 03:33:38
【问题描述】:

我正在测试一个具有函数 foo 的接口的使用。这是我在我的模拟中对这个函数的实现:

class Mock
{
public:
    void foo(Foo::const_iterator begin, Foo::const_iterator end) {
      _begin = begin;
      _end = end;

      ...
    }
    ...
    Foo::const_iterator _begin;
    Foo::const_iterator _end;
};

然后我有一个测试来检查是否调用了 foo:

// test that function foo is not called
EXPECT_EQ(mock->_begin, Foo::const_iterator());

但这让我在 Visual Studio 中断言迭代器不兼容。如果我没有调用 foo(),我会期望 _begin 将等于 Foo::const_iterator()。为什么不呢?

【问题讨论】:

  • operator ==Foo::const_iterator() 是否允许将两个默认构造的实例相互比较?使默认构造的迭代器“无效”和“不同于任何迭代器”将是语义的有效选择。
  • @stardust_ 你如何比较一个成员和一个类型?

标签: c++ std


【解决方案1】:

只有指向同一个容器的迭代器才具有可比性。默认构造的迭代器根本不指向容器,因此根据定义它与任何东西都不兼容。

【讨论】:

  • 是的,总结一下。这样的迭代器有一个所谓的“奇异值”,这是可以解释这一点的搜索词。
【解决方案2】:

也许 VS 使用默认构造的迭代器来实现其迭代器兼容性检查,这样默认构造的迭代器永远不会与任何其他迭代器兼容,即使是默认构造的迭代器也不兼容。

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2023-03-15
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    相关资源
    最近更新 更多