|
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