# Folly::future V.S. std::future

```cpp
#include <future>
#include <iostream>
#include <thread>
 
int main()
{
    // future from a packaged_task
    std::packaged_task<int()> task([]{ return 7; }); // wrap the function
    std::future<int> f1 = task.get_future(); // get a future
    std::thread t(std::move(task)); // launch on a thread
 
    // future from an async()
    std::future<int> f2 = std::async(std::launch::async, []{ return 8; });
 
    // future from a promise
    std::promise<int> p;
    std::future<int> f3 = p.get_future();
    std::thread([&p]{ p.set_value_at_thread_exit(9); }).detach();
 
    std::cout << "Waiting..." << std::flush;
    f1.wait();
    f2.wait();
    f3.wait();
    std::cout << "Done!\nResults are: "
              << f1.get() << ' ' << f2.get() << ' ' << f3.get() << '\n';
    t.join();
}
```

Appending some syntax a

```cpp
Capture Clause: The capture clause is the part inside the square brackets [ ] in a lambda expression. It determines how variables from the surrounding scope are accessed inside the lambda. There are several ways to capture variables:

[&]: Capture all variables by reference.
[=]: Capture all variables by value.
[p]: Capture the variable p by value.
[&p]: Capture the variable p by reference.
[=, &p]: Capture all variables by value, but capture p by reference.
[&, p]: Capture all variables by reference, but capture p by value.
```

# Reference

1. [Facebook Future Blog](https://engineering.fb.com/2015/06/19/developer-tools/futures-for-c-11-at-facebook/)
    
2. [cppreference.com std::future](https://en.cppreference.com/w/cpp/thread/future)
