### <a name="Rcoro-capture"></a>CP.51: Do not use capturing lambdas that are coroutines
### <a name="Rcoro-capture"></a>CP.51: Do not use capturing lambdas that are coroutines
##### Reason
##### Reason
Usage patterns that are correct with normal lambdas are hazardous with coroutine lambdas. The obvious pattern of capturing variables will result in accessing freed memory after the first suspension point, even for refcounted smart pointers and value types.
Usage patterns that are correct with normal lambdas are hazardous with coroutine lambdas. The obvious pattern of capturing variables will result in accessing freed memory after the first suspension point, even for refcounted smart pointers and value types.
A lambda results in a closure object with storage, often on the stack, that will go out of scope at some point. When the closure object goes out of scope the captures will also go out of scope. Normal lambdas will have finished executing by this time so it is not a problem. Coroutine lambdas may resume from suspension after the closure object has destructed and at that point all captures will be use-after-free memory access.
A lambda results in a closure object with storage, often on the stack, that will go out of scope at some point. When the closure object goes out of scope the captures will also go out of scope. Normal lambdas will have finished executing by this time so it is not a problem. Coroutine lambdas may resume from suspension after the closure object has destructed and at that point all captures will be use-after-free memory access.
##### Example, Bad
##### Example, Bad
```cpp
int value = get_value();
int value = get_value();
std::shared_ptr<Foo> sharedFoo = get_foo();
std::shared_ptr<Foo> sharedFoo = get_foo();
{
{
const auto lambda = [value, sharedFoo]() -> std::future<void>
const auto lambda = [value, sharedFoo]() -> std::future<void>