1

我正在使用 Boost.Range 来传递一些数据和该数据的容器类。数据在不同的线程中加载,在某些情况下可能还没有准备好。在这种情况下,容器使用默认的 iterator_range 进行初始化,因此包含单个迭代器。我正在分配和复制数据容器(因此是 iterator_ranges)。但是, iterator_range 复制构造函数调用 begin() 和 end() ,它们将在原始数据为单数时断言。因此,无法复制空的数据容器。

有什么办法可以避免这种限制吗?

为什么要实施此限制?以下工作正常,范围不应该表现相似吗?

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?
4

1 回答 1

3

如果通过“工作”,您的意思是“它不会因我当前的编译器版本和调用选项而崩溃”,那么是的,分配一个单一的迭代器可能会“工作”。其实代码

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

导致未定义的行为,因此您可以随心所欲地了解可能发生的情况。

C++ 标准对此有这样的说法(第 [lib.iterator.requirements]/5 节):

[...] 对于奇异值,大多数表达式的结果是未定义的;唯一的例外是将非奇异值分配给包含奇异值的迭代器。在这种情况下,奇异值会以与任何其他值相同的方式被覆盖。可取消引用和过去的值总是非单一的。

因此,最终范围确实类似于单个迭代器。它只是不能按照你想要的方式工作。
我认为最好的方法是在数据尚未准备好时使用空范围(用非奇异迭代器显式构造),而不是使用奇异范围。

于 2010-09-06T11:35:31.177 回答