Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2004-12-01 23:40:21

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::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

Boost list run by bdawes at, gregod at, cpdaniel at, john at