Peter - I like this idea, but I don't think it's correct. it appears to me that __invoke takes its' first parameter (the functor) by either lvalue or rvalue reference - not const. That means that it could modify it. http://llvm-reviews.chandlerc.com/D2059