I posted something similar in the first of the many improving-lambda threads this month, but it had a lot of little problems and one big one.
The big one is that not every expression can be caught by operator overloading (foo[i] is fine, but lst[foo] isn't). And call expressions are one of the most important kinds of expression, but you can't catch that--or, rather, if you _do_ catch it, then you have no way to call the resulting object.
The same idea in C++ doesn't have that last problem because C++ is statically typed, and you can use an implicit cast from autolambda object to function object to get from an object whose call operator builds a call expression to one whose call operator evaluates the expression. But that doesn't work in Python.
I wrote a blog post that gets into this further, but I can't find the link from my phone. I included it in an earlier message in the thread.