boost::range::d etail::any_iterator 不能很好地与 boost::zip_iterator 一起使用
boost::range::detail::any_iterator doesn't play well with boost::zip_iterator
考虑以下代码:
#include <boost/iterator/zip_iterator.hpp>
#include <boost/range/detail/any_iterator.hpp>
#include <boost/tuple/tuple.hpp>
#include <iostream>
#include <vector>
typedef boost::range_detail::any_iterator<
boost::tuple<int &, char &>,
boost::random_access_traversal_tag,
boost::tuple<int &, char &> &,
std::ptrdiff_t
> IntCharIterator;
int main()
{
std::vector<int> v1 = {1, 2, 3, 4, 5};
std::vector<char> v2 = {'a', 'b', 'c', 'd', 'e'};
auto it = IntCharIterator(boost::make_zip_iterator(
boost::make_tuple(v1.begin(), v2.begin()))
);
auto end_ = IntCharIterator(boost::make_zip_iterator(
boost::make_tuple(v1.end(), v2.end()))
);
for (; it != end_; ++it)
std::cerr << it->get<0>() << " " << it->get<1>() << "n";
return 0;
}
它可以按预期(即打印" 1 a n2 b ...")进行编译而没有优化,但是使用-O2编译时segfaults或产生垃圾(带有clang-3.6.0和GCC-4.9.2,提升1.56.0),我不知道怎么了。
另外,当删除Intchariterator包装器时,该代码按预期工作,以任意优化级别。
有人知道这里发生了什么吗?
这是boost.range:#10493 以来的错误无效的SSL证书)。这是Fix for Bug#5816 any_range引入的回归,需要可复制的元素。
奇怪的是,解决方法是使您的Reference
模板类型参数const
:
typedef boost::range_detail::any_iterator<
boost::tuple<int &, char &>,
boost::random_access_traversal_tag,
boost::tuple<int &, char &> const, // 'const', no '&'
std::ptrdiff_t
> IntCharIterator;
如果您希望代码与1.56版本一起使用,则可以使用预处理器条件:
typedef boost::range_detail::any_iterator<
boost::tuple<int &, char &>,
boost::random_access_traversal_tag,
#if BOOST_VERSION < 105600
boost::tuple<int &, char &>, // no '&'
#else
boost::tuple<int &, char &> const, // 'const', no '&'
#endif
std::ptrdiff_t
> IntCharIterator;
请注意,在任何情况下,Reference
模板类型参数应该具有&
;根据zip_iterator
概述,reference_type
与value_type
相同,因为它是参考的元组:
typedef reference value_type;
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- 造成致命错误:boost/fusion/iterator/equal_to.hpp 没有这样的文件或目录
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- boost::asio::ip::tcp::resolver::iterator 检查值是否为空
- 来自async_resolve的 boost::asio::ip::tcp::resolver::iterator 的生命周期是多久?
- Clang Modules 与 std <iterator> 和 <boost/move/iterator.hpp 的交互>
- 为什么箭头运算符"->"不适用于 boost::numeric::ublas::vector<...>::iterator?
- 标记字符串并将结果存储在 boost::iterator_range<std::string::iterator 中>
- 将 boost::p tr_vector<char>::iterator itr 转换为其中的数据?
- 如何转发声明 boost::p tree::iterator