&gt; I think the primary need for manual declaration is because in C++ you need to differentiate between pass by copy semantics and pass by reference semantics.<p>That&#x27;s not actually a <i>need</i>, C++ includes [=] and [&amp;] (capture everything by value or by reference). You can get a mix by creating references outside the body then capturing the environment by value (capturing the references by value and thus getting references).<p>On the one hand it has a bit more syntactic overhead (you have to take and declare a bunch of references before creating the closure), on the other hand there&#x27;s less irregularity to the language, and bindings mean the same thing in and out of the closure.<p>FWIW that&#x27;s what Rust does[0], though it may help that Rust&#x27;s blocks are &quot;statement expressions&quot;, some constructs would probably be unwieldy without that.<p>[0] the default corresponds to C++&#x27;s [&amp;] (capture by ref), and a &quot;move closure&quot; switches to [=] instead