I am trying out future<>.then and I am seeing some results that confuses me. I have tried to illustrate this with a few examples. The first example is using a promise together with future<>.then. It generates no output: boost::promise<int> promise; boost::future<int> fut = promise.get_future(); promise.set_value(123); fut.then([](boost::future<int>& f) { std::cout << "The value is: " << f.get() << std::endl; return f.get(); }); boost::chrono::milliseconds duration(1000); boost::this_thread::sleep_for(duration); Why is fut.then not triggered? (assigning fut.then to another future makes no difference) By adding a launch policy I get the output "The value is: 123" which is the output I would expect from all my examples: boost::promise<int> promise; boost::future<int> fut = promise.get_future(); promise.set_value(123); fut.then(boost::launch::async, [](boost::future<int>& f) { std::cout << "The value is: " << f.get() << std::endl; return f.get(); }); boost::chrono::milliseconds duration(1000); boost::this_thread::sleep_for(duration); To make this more real, let's move promise.set_value to after .then boost::promise<int> promise; boost::future<int> fut = promise.get_future(); fut.then(boost::launch::async, [](boost::future<int>& f) { std::cout << "The value is: " << f.get() << std::endl; return f.get(); }); promise.set_value(123); boost::chrono::milliseconds duration(1000); boost::this_thread::sleep_for(duration); This program outputs nothing and never terminates. But when I assign the result of fut.then to another future I get the expected output once again: boost::promise<int> promise; boost::future<int> fut = promise.get_future(); boost::future<int> fut2 = fut.then(boost::launch::async, [](boost::future<int>& f) { std::cout << "The value is: " << f.get() << std::endl; return f.get(); }); promise.set_value(123); boost::chrono::milliseconds duration(1000); boost::this_thread::sleep_for(duration); Finally, as I bonus I add an example where I use async to generate a future instead. boost::future<int> fut = boost::async([]() { return 123; }); fut.then([](boost::future<int>& f) { std::cout << "The value is: " << f.get() << std::endl; return f.get(); }); boost::chrono::milliseconds duration(1000); boost::this_thread::sleep_for(duration); This generates the output "The value is: " (without 123). Once again, by assigning the result of fut.then to another future I get the expected output. I use boost 1.54 beta 1 with clang 3.2 on Linux and. /Tobias