将boost :: iterator_range分配给奇异范围

时间:2010-09-06 11:09:40

标签: c++ boost iterator singular

我正在使用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?

1 个答案:

答案 0 :(得分:3)

如果通过“工作”,你的意思是“它不会爆炸我当前的编译器版本和调用选项”,那么是的,分配一个单一的迭代器可能“工作”。 实际上,代码

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

导致未定义的行为,因此您可以根据可能发生的情况了解编译器的想法。

C ++标准对此有所说明(第[lib.iterator.requirements] / 5节):

  

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

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