
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