Does this mean that an existing closure might refer to a non-local
variable that has already been de-allocated?
Sì. Estendere il tempo di vita di un oggetto che è stato assegnato alla pila oltre l'esecuzione della funzione esterna sembra essere da qualche parte tra irragionevole e impossibile. Inoltre, il compilatore non tenterà di verificare se tale estensione è necessaria e di allocare magicamente l'oggetto sull'heap o qualcosa del genere. Come programmatore devi essere esplicito su ciò che dovrebbe accadere in relazione all'assegnazione. Se si desidera utilizzare il negozio gratuito (aka heap), utilizzare il negozio gratuito. Non c'è nulla di magico in corso con lambda. Se fai in modo che l'oggetto di chiusura memorizzi l'indirizzo di qualche altro oggetto che era solito vivere nello stack e provi ad accedervi dopo che è scomparso, il comportamento non è definito.
any special care / best practice that one has to follow when using
captured non-local variables inside a C++ closure?
Assicurati che il tuo lambda non acquisisca per riferimento se l'oggetto lambda (o una sua copia) sopravvive rispetto all'ambito in cui è stato creato (o l'originale). Ad esempio, usando un lambda che cattura per riferimento come argomento ad alcuni degli algoritmi che trovi nell'intestazione dell'algoritmo va perfettamente bene.