
Eric Niebler: ...
Like a good citizen, I've written make_foo's function call operator to recognize reference_wrapped and non-const-ref arguments as representing lvalues and all others as rvalues.
Const-ref arguments are lvalues. I'm not sure why do you need the reference_wrapper support.
The strictly correct thing to do would be to wrap lvalues in reference_wrappers before passing them to F. If I don't, make_foo will do the wrong thing.
I don't see why. Lvalues are lvalues. Wrapping them in a reference_wrapper won't make them any more lvaluish. I'm probably missing something.
struct blarg { template<typename This, typename Arg> struct result< This( Arg ) > { // OK, if Arg is a reference, then it's an lvalue! };
template<typename Arg> typename result< make_foo( ??? ) >::type operator()( Arg const & arg ) { // whoops, I don't know here if arg is an lvalue or rvalue } };
Write the return statement. Is it return make_foo()( arg ); ? If so, the ??? part is "Arg const&", because that's what 'arg' is.