
Peter Dimov wrote:
Eric Niebler:
// lvalue result_of<identity(int &)>::type l = identity()(i); assert( &l == &i );
Does this really compile for you?
Yes. #include <cassert> #include <boost/utility/result_of.hpp> struct identity { template<typename Sig> struct result; template<typename This, typename Arg> struct result<This(Arg)> { typedef Arg type; }; template<typename Arg> Arg &operator()(Arg &arg) const { return arg; } template<typename Arg> Arg const &operator()(Arg const &arg) const { return arg; } }; int main() { using boost::result_of; int i = 0; int const j = 0; // rvalue result_of<identity(int)>::type k = identity()(1); assert( 1 == k ); // lvalue result_of<identity(int &)>::type l = identity()(i); assert( &l == &i ); // const lvalue result_of<identity(int const &)>::type m = identity()(j); assert( &m == &j ); } -- Eric Niebler Boost Consulting www.boost-consulting.com