C++ 将boost::iterator_范围指定给奇异范围

C++ 将boost::iterator_范围指定给奇异范围,c++,boost,iterator,singular,C++,Boost,Iterator,Singular,我使用Boost.Range传递一些数据,并为这些数据传递一个容器类。数据加载到不同的线程中,在某些情况下可能尚未准备就绪。在这种情况下,使用默认迭代器_范围初始化容器,因此包含单个迭代器。我正在做数据容器的赋值和复制(因此是迭代器范围)。但是,迭代器_range copy构造函数调用begin()和end(),这将在原始值为单数时断言。因此,不可能复制空数据容器 有没有办法避免这种限制 为什么要实施这一限制?下面的操作很好,范围的行为不应该类似吗 typedef std::vector<

我使用Boost.Range传递一些数据,并为这些数据传递一个容器类。数据加载到不同的线程中,在某些情况下可能尚未准备就绪。在这种情况下,使用默认迭代器_范围初始化容器,因此包含单个迭代器。我正在做数据容器的赋值和复制(因此是迭代器范围)。但是,迭代器_range copy构造函数调用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?
typedef std::vector::iterator迭代器;
迭代器;//单数的
迭代器it2=it;//作品
boost::迭代器_范围;//单数的
boost::迭代器_range range 2=range;//在调试中断言,但为什么?
如果所说的“工作”,您的意思是“它不会因为我当前的编译器版本和调用选项而崩溃”,那么是的,分配单个迭代器可能“工作”。 实际上,代码

typedef std::vector<int>::iterator iterator;
iterator it; // Singular
iterator it2 = it; // Works
typedef std::vector::iterator迭代器;
迭代器;//单数的
迭代器it2=it;//作品
结果导致未定义的行为,因此您可以根据编译器的突发奇想来决定可能发生的情况

C++标准对此有说明([LIB,迭代器,要求] / 5):

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

因此,在最终范围中,的工作方式类似于单个迭代器。它就是不能按您想要的方式工作。

我认为最好的方法是在数据尚未准备好时使用空范围(显式构造为to非奇异迭代器),而不是奇异范围。

有趣的是,我不知道这是一个限制,以前也没有看到过效果。你知道这种行为的原因吗?它似乎与GCC和MSVC配合得很好,因为我们在应用程序中一直在这样做…:/未定义行为的原因是它甚至不需要为普通指针工作。当您查看单个指针值时,实现可能会陷入陷阱。GCC和MSVC编译器只是没有利用这一点,而是生成允许读取无效指针值的代码。读取代码时,很容易认为第二个迭代器已初始化。