A Range does not require copy semantics according to the boost docs. http://www.boost.org/doc/libs/1_38_0/libs/range/doc/range.html The SinglePassRangeConcept (and all range concepts using it) requires a range to be default constructible. (There is a line "T a;" in the concept The default constructible requirement means an abstract base class can never implement any Range Concept. If a range does not require any copy semantics, I don't see why it must be default constructible? Are there any good reasons I don't know about? A change from "T a;" to "const T& a" in concepts.hpp would do the trick... Example: struct AbstractArraySlice { int* begin() const = 0; int* end() const = 0; }; // FAILS: BOOST_CONCEPT_ASSERT((SinglePassRangeConcept<AbstractArraySlice>)) Footnote: I often use abstract base classes to verify my algorithms do not use more functionality than necessary and it annoys me that I can't use the range concept check: struct TestSum { const AbstractArraySlice& r; void Test() { CalculateSum(r); } }; template<class T> T CalculateSum(const T& range) <... function requires SinglePassRangeConcept ...> -- View this message in context: http://www.nabble.com/Why-must-a-Single-Pass-Range-be-default-constructible-... Sent from the Boost - Users mailing list archive at Nabble.com.