
Doug Gregor wrote:
On Dec 27, 2006, at 7:55 AM, Tobias Schwinger wrote:
here's another result_of question:
Given a function object
struct f { template< typename T > r<T> operator()(T const &) const;
template< typename T > r<T&> operator()(T &) const;
template< typename Sig > struct result; };
,
result_of< f(some_obj &) >::type // is r<T&> result_of< f(some_obj const & >::type // is r<T>
but what about:
result_of< f(some_obj) >::type // is r<T>?
Yes, that's right.
That's what I'd do intuitively. I also found an example (written by Dave) on the net that seems to do the same:
But wait: the TR1 text is talking about lvalues so I probably should let F::result return r<T&>?!
TR1 says...
Given an rvalue f of type F and values t1, t2, ..., tN of types T1, T2, ..., TN, respectively, the type member is the result type of the expression f(t1, t2, ...,tN). The values ti are lvalues when the corresponding type Ti is a reference type, and rvalues otherwise.
Sorry - it seems I missed that last part of the sentence, somehow (maybe by looking at the wrong version?).
So with result_of< F(some_obj)>, we treat some_obj as an rvalue, and get the same result as for result_of< f(some_obj const & >.
OK, got it. Thank you! Regards, Tobias