
Boost iterators aren't SFINAE-friendly. This is a problem when building traits that detect certain behavior. Heres a simple example: #include <vector> #include <type_traits> #include <boost/iterator/filter_iterator.hpp> template<class> struct holder { typedef void type; }; template<class Iterator, class=void> struct is_advanceable : std::false_type {}; template<class Iterator> struct is_advanceable<Iterator, typename holder< decltype(std::declval<Iterator>() += std::declval<int>()) >::type> : std::true_type {}; static_assert(is_advanceable<std::vector<int>::iterator>::value, "This will pass"); struct predicate { template<class T> bool operator()(T&&) const; }; static_assert(not is_advanceable<boost::filter_iterator<predicate, std::vector<int>::iterator>>::value, "This won't pass"); Although, it doesn't always lead to a compile error(rather than subtitution failure), it does lead some very erroneous errors. Thanks, Paul -- View this message in context: http://boost.2283326.n4.nabble.com/Boost-iterators-are-not-SFINAE-friendly-t... Sent from the Boost - Dev mailing list archive at Nabble.com.