std :: fill с zip_iterator не может скомпилироваться на clang и c ++ 11 - PullRequest
5 голосов
/ 13 мая 2019

Похоже, что 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)?

...