代码之家  ›  专栏  ›  技术社区  ›  larsmoa

将boost::iterator\范围赋给奇异范围

  •  1
  • larsmoa  · 技术社区  · 14 年前

    有没有办法避免这种限制?

    为什么要实施这一限制?下面的工作很好,难道不应该有类似的行为吗?

    typedef std::vector<int>::iterator iterator;
    iterator it; // Singular
    iterator it2 = it; // Works
    
    boost::iterator_range<iterator> range; // Singular
    boost::iterator_range<iterator> range2 = range; // Asserts in debug, but why?
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   Bart van Ingen Schenau    14 年前

    如果“works”的意思是“它不适合我当前的编译器版本和调用选项”,那么是的,分配一个单一的迭代器可能“起作用”。 实际上,密码

    typedef std::vector<int>::iterator iterator;
    iterator it; // Singular
    iterator it2 = it; // Works
    

    导致未定义的行为,因此您可以根据编译器的突发奇想来决定可能发生的情况。

    C++标准对此有说明(章节)lib.iterator.requirements要求]/5):

    […]对于奇异值,大多数表达式的结果都是未定义的;唯一的例外是将非奇异值赋给持有奇异值的迭代器。在这种情况下,奇异值的覆盖方式与任何其他值相同。可解引用的和超过结束值的总是非奇异的。

    所以,在最后的范围
    我认为最好的方法是在数据还没有准备好的时候使用一个空范围(显式地用to非奇异迭代器构造),而不是一个奇异范围。