Without auto-ref we could still have &mut vec <- x, or plain vec <- x if vec is actually a &mut Vec (not at all rare). But yes, auto-ref is a big win. I don’t see what can of worms it opens, other than the current implementation (HIR expansion) being unsuitable — but at least for box, the implementation may already change for other reasons (type inference) as outlined in the OP.
And it’s not just, and not primarily, about the number of characters typed. In my and other people’s vision, <- would be the default, the most simple and aesthetic way of inserting in a collection: the <- syntax is visually evocative, it’s the same for different collections (Vec::push vs. HashSet::insert), and it has less visual noise than the alternatives (no parentheses, no || prefix).
While reading this, it occurred to me that the closure form actually isn’t equivalent in the number of moves! In the following example (after whatever temporaries and moves are involved in try! or ?), the payload of the Ok variant is moved into the local arg, then moved into the closure object, and then finally moved into the Vec's backing buffer.
let arg = try!(compute_argument());
vec.emplace(|| arg);
Contrast this with the <- equivalent (vec <- try!(arg);), which does indeed need a temporary for the Result just like the above code, but in the Ok case directly (again, after whatever happens in the try!) copies the payload into the Vec's memory. And despite the closure being quite inlinable, the move from the Result temporary into the local occurs before the memory allocation, so we can’t be sure it gets reordered. (Not to mention that the closure isn’t 100% guaranteed to be inlined, the fact that LLVM has been and still is less-than-stellar about optimizing memcpys, and a million other minor wrinkles.)
So there’s that. But even if it were fully equivalent, I don’t think we’d want the error that the closure implies. That would assume people only use placement (in whatever form) when they absolutely positively need the optimization and can not tolerate anything less. This is antithetical to the vision of placement becoming the default syntax — it doesn’t always have to be always faster (the ? case needs a temporary regardless of how you approach it), it just has to be always at least as fast as the alternatives (Vec::push and your hypothetical Vec::emplace).
Besides, Rust makes a point of being relatively explicit about costs, if you know what to look for, but it doesn’t go out of its way to actively penalize slight inefficencies. If someone does not know, or does not care, that a ? expression involves an extra temporary, forcing them to move the ? out of the closure doesn’t help them, it just force them to write uglier code and prolong the “fight the compiler” phase. Furthermore, even if we wanted to highlight these situations, a lint could do the job just as well, but one could silence it.