$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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::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