+++ title = "`lazy/atomic_lazy`" description = "A lazily evaluated coroutine awaitable with Outcome customisation." +++ This is very similar to {{% api "eager" %}}, except that execution of the `lazy` returning function suspends immediately. Functions which return `lazy` are therefore suitable for tasks which you need to instantiate right now, but whose execution will occur elsewhere e.g. in a separate kernel thread. Because of the very common use case of using worker threads to execute the body of lazily executed coroutines, most people will want to use `atomic_lazy` instead of `lazy`. `atomic_lazy` is like `lazy`, except that the setting of the coroutine result performs an atomic release, whilst the checking of whether the coroutine has finished is an atomic acquire. `lazy` has similar semantics to `std::lazy`, which is being standardised. See https://wg21.link/P1056 *Add lazy coroutine (coroutine task) type*. Example of use (must be called from within a coroutinised function): ```c++ lazy func(int x) { co_return x + 1; } ... // Always suspends perhaps causing other coroutines to execute, then resumes. int r = co_await func(5); ``` `lazy` has special semantics if `T` is a type capable of constructing from an `exception_ptr` or `error_code` -- any exceptions thrown during the function's body are sent via `T`, preferably via the error code route if {{% api "error_from_exception(" %}}`)` successfully matches the exception throw. This means that a {{% api "basic_result" %}} or {{% api "basic_outcome" %}} where one of its types is is compatible will have its `.error()` or `.exception()` set. Note that `lazy` does not otherwise transport exception throws, and rethrows any exceptions thrown within the coroutine body through the coroutine machinery. This does not produce reliable consequences in current C++ compilers. You should therefore wrap the coroutine body in a `try...catch` if `T` is not able to transport exceptions on its own. *Requires*: C++ coroutines to be available in your compiler. *Namespace*: `BOOST_OUTCOME_V2_NAMESPACE::awaitables` *Header*: ``