Похоже, что zip_iterator оценивает iterator_category в std :: input_iterator_tag для приведенного ниже фрагмента кода.
Но реализация std :: fill в Xcode (я использую 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, которая генерирует "std :: input_iterator_tag" как iterator_category,
ИЛИ
std :: fill версия XD :: input_iterator_tag отсутствует в Xcode (clang)?