Hi,

On Fri, Apr 10, 2009 at 3:50 AM, 041021042 <041021042@fudan.edu.cn> wrote:
Hi,

I found another problem of range_ex. The following code still works well with the old version of range_ex (Dec 2008), and cause a compile error with the newest version.


The 'regression' was due to improved checking of the range concept constraints within the boost::copy algorithm.

It appears that the filter_iterator assignment operator is invalid when used with the lambda expression you have chosen. Since the filter_iterator assignment is invalid it stands to reason that the range made from these iterators also did not have a valid assignment operator and hence the range library was correctly reporting that the result of the expression was not a valid model of the SinglePassRangeConcept.

I suspect that the sample code provided was a stripped down example, but just in case it wasn't I would like to point out that:
1. is_even can be implemented more efficiently as bool is_even(int x) { return x & 1 == 0; }
2. The use of Boost.Lambda for the expression:
   boost::copy( input | filtered(bind(is_even, _1)),
       std::ostream_iterator<int>(std::cout, ",") );

Hence it can be replaced with:
   boost::copy( input | filtered(&is_even), std::ostream_iterator<int>(std::cout, ",") );

I have uploaded a new version to the Boost Vault that relaxes the SinglePassRangeConcept constraint to improve compatibility with Boost.Lambda.

Thank you again for your report. I shall be making more tests for compatibility with Boost.Lambda and making improvements where appropriate.

Best Wishes,
Neil Groves