Почему std::istreambuf_iterator не проходит проверку концепции SinglePassIterator для повышения?
Следующая программа:
#include <boost/range/concepts.hpp>
#include <iterator>
#include <istream>
using boost::range_detail::SinglePassIteratorConcept;
int main()
{
BOOST_CONCEPT_ASSERT(( SinglePassIteratorConcept<std::istreambuf_iterator<char>> ));
}
Не в состоянии скомпилировать как MSVC, так и gcc. Ошибка MSVC заключается в следующем:
D:\libraries\boost\boost/range/concepts.hpp(157) : error C2440: 'initializing' : cannot convert from 'char' to 'char &'
D:\libraries\boost\boost/range/concepts.hpp(147) : while compiling class template member function 'boost::range_detail::SinglePassIteratorConcept<Iterator>::~SinglePassIteratorConcept(void)'
with
[
Iterator=std::istreambuf_iterator<char,std::char_traits<char>>
]
D:\libraries\boost\boost/concept/detail/has_constraints.hpp(42) : see reference to class template instantiation 'boost::range_detail::SinglePassIteratorConcept<Iterator>' being compiled
with
[
Iterator=std::istreambuf_iterator<char,std::char_traits<char>>
]
D:\libraries\boost\boost/concept/detail/msvc.hpp(58) : see reference to class template instantiation 'boost::concepts::not_satisfied<Model>' being compiled
with
[
Model=boost::range_detail::SinglePassIteratorConcept<std::istreambuf_iterator<char,std::char_traits<char>>>
]
test.cpp(10) : see reference to class template instantiation 'boost::concepts::require<Model>' being compiled
with
[
Model=boost::range_detail::SinglePassIteratorConcept<std::istreambuf_iterator<char,std::char_traits<char>>>
]
D:\libraries\boost\boost/range/concepts.hpp(160) : error C2440: 'initializing' : cannot convert from 'char' to 'char &'
В результате алгоритмы Boost.Range, такие как boost::copy
не работать с istreambuf_iterator
,
Что здесь происходит? Что я могу сделать, чтобы это исправить или обойти это?
РЕДАКТИРОВАТЬ: Непосредственной причиной ошибки, кажется, что istreambuf_iterator
"s reference_type
является char&
, но это operator*
возвращается char
, Для правильно сформированного итератора не следует operator*
всегда возвращайся reference_type
?
1 ответ
Единственное требование типа operator*
из InputIterator
это то, что он может быть преобразован value_type
(§24.1.1/2). Поскольку бессмысленно присваивать значение результату operator*
для istreambuf_iterator
было бы неправильно возвращать ссылку или любое значение lvalue. Boost не в состоянии проверить это свойство.