|
Boost : |
From: Eric Niebler (eric_at_[hidden])
Date: 2006-05-30 14:49:01
Thorsten Ottosen wrote:
> Eric Niebler wrote:
>> Thorsten Ottosen wrote:
>>
>>> Eric Niebler wrote:
>
>>>> If make_iterator_range() returned a const-qualified iterator_range<>,
>>>> this would work. Thorsten?
>>> Isn't the problem thet out is a reference?
>
>> out is a reference, which means that non-const rvalues will not bind to
>> it. But const rvalues will because out_t will be deduced to be
>> "iterator_range<> const". Try it and see.
>
> I see. I certainly didn't know that. I could get it to work on
> gcc, but not vc8.
>
> On what compilers does it actually work?
All of them, as far as I know. I just tried on VC8 and it worked:
template<typename T> void foo(T &) {}
struct empty {};
empty const bar() { empty e; return e; }
int main()
{
foo(bar());
return 0;
}
Without thinking about this deeply, it seems that lightweight proxy
objects such as iterator_range<> should always be returned as a
const-qualified rvalues for precisely this reason.
(Note that cv-qualifications on intrinsic return types are ignored, so
"int foo()" and "int const foo()" are the same. Perhaps that's the
problem you were seeing?)
-- Eric Niebler Boost Consulting www.boost-consulting.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk