Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2008-04-07 01:29:53


shunsuke wrote:
> Eric Niebler wrote:
>> I think that's right so far. Now imagine a simple identity function
>> object, that just returns its argument unmodified:
>>
>> struct identity
>> {
>> template<typename Sig>
>> struct result;
>>
>> template<typename This, typename Arg>
>> struct result<This(Arg)>
>> {
>> typedef Arg type;
>> };
>>
>> template<typename Arg>
>> Arg const &operator()(Arg const &arg)
>> {
>> return arg;
>> }
>>
>> // and a non-const overload, too
>> };
>
> Let me clarify.
> This identity implementation is simply wrong (if you pass an rvalue to identity.)
> because of inconsistency between decltype and result_of.
> Am I missing anything?

I don't think so. If I have an rvalue, I compute the return type and
invoke the function as follows:

   result_of<identity(int)>::type i = identity()(1);

This is perfectly safe. If I have an lvalue, it looks like this:

   int const i = 0;
   result_of<identity(int const &)>::type j = identity()(i);

Also perfectly safe.

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