|
Boost Users : |
From: Chris Saunders (ctsa_at_[hidden])
Date: 2003-10-21 05:33:34
I've tried to compile one of the examples from the filter_iterator
documentation:
main()
{
int numbers[] = { 0, -1, 4, -3, 5, 8, -2 };
const int N = sizeof(numbers)/sizeof(int);
std::copy(boost::make_filter_iterator(numbers, numbers + N,
std::bind2nd(std::greater<int>(),
-2)),
boost::make_filter_iterator(numbers + N, numbers + N,
std::bind2nd(std::greater<int>(),
-2)),
std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
using a version of g++ 3.3.2 that has concept-checks enabled. In this case
the compiler rejects both of the iterators returned by
make_filter_iterator in the above code because they do not fulfill the
InputIterator concept required by std::copy. This is because InputIterator
requires the DefaultConstructable concept, and the predicate:
std::bind2nd(std::greater<int>(),-2) , isn't default constructable.
My question is this: is this type of iterator (non-default-constructable)
safe to use in general even if it fails a conceptual requirement? Of
course the above code runs as expected with a normal g++ build and I could
always wrap the predicate in another object if I really wanted to use
concept-checks... but I'm interested in whether the above code is
considered normal and safe as it stands.
Thanks for any insight.
-Chris
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net