
David Abrahams wrote:
Eric Niebler wrote:
If anyone knows of a foolproof way to distinguish lvalues from rvalues, I'm all ears.
See the contents of boost/iterator/is_lvalue_iterator.hpp
Sorry to break this to you Dave, but is_lvalue_iterator suffers from the same problem as BOOST_FOREACH. Consider: struct rvalue_iterator : std::iterator< std::forward_iterator_tag , std::list<int> , ptrdiff_t , std::list<int> const * , std::list<int> const & > { std::list<int> const operator*() const; }; BOOST_STATIC_ASSERT( ! boost::is_lvalue_iterator<rvalue_iterator>::value ); The static assert fails. Since operator* returns a /const/ UDT, it binds to T&, which fools your lvalue detection scheme. I don't know enough about iterator requirements to say whether operator* is permitted to return a const-qualified object of value_type, but regardless, it's still a problem for BOOST_FOREACH. Any other thoughts? -- Eric Niebler Boost Consulting www.boost-consulting.com