2011-08-09 51 views
2

下面的程序:爲什麼std :: istreambuf_iterator失敗boost的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::copyistreambuf_iterator工作。

這是怎麼回事?我能做些什麼來解決或解決它?

編輯:錯誤的直接原因似乎是,istreambuf_iteratorreference_typechar&,但它的回報operator*char。對於格式良好的迭代器,不應該總是返回?

+0

idk,但它似乎是一個很好的抓住! :-)也許在boost郵件列表上提問。 –

回答

3

InputIteratoroperator*類型的唯一要求是它可以轉換爲value_type(§24.1.1/ 2)。由於對istreambuf_iteratoroperator*的結果賦值並沒有意義,所以它返回一個引用或任何類型的左值將是不正確的。 Boost錯誤地檢查該屬性。