似乎zip_iterator将iterator_category评估为以下代码段的std :: input_iterator_tag。
但是Xcode中std :: fill的实现(我正在使用Xcode10.1.0.app)具有特定于forward_iterator_tag和random_access_iterator_tag的实现,但没有input_iterator_tag的实现。因此,代码会导致编译错误。
同一代码在gcc-6.3.0中可以正常编译。
//zip_iterator.cpp
#include <boost/iterator/zip_iterator.hpp>
#include <iterator>
#include <iostream>
template <typename Iterator>
void FooImpl(Iterator first, Iterator last, std::input_iterator_tag ) {
std::cout<< "Input Iteartor Tag\n";
}
template <typename Iterator>
void Foo(Iterator first, Iterator last) {
typedef typename std::iterator_traits<Iterator>::iterator_category category;
FooImpl(first, last, category());
}
template<typename T>
void foo()
{
boost::zip_iterator<boost::tuple<T*> > iter;
Foo(iter,iter);
std::fill(iter, iter, boost::make_tuple(T())); //Fails to compile
}
int main()
{
foo<int>();
return 0;
}
它是boost zip_iterator中的错误,它会生成iter_category作为“ std :: input_iterator_tag”,
OR
Xp(clang)中缺少std :: input_iterator_tag的std :: fill版本吗?