blob: 0fad85f2928c1ec0074f00a9231824a972a76798 [file] [view]
# The Builder Lambda Pattern
The builder lambda pattern allows you to do multi-stage construction for objects
that can't be copy-assigned without putting temporaries needed during that
construction at function scope.
Suppose you have a class `C` with some deps, which you construct like this:
C foo;
{
A a;
a.set_property(value);
foo = MakeC(a);
}
This requires that `C` has an "empty state" and is mutable. If you want to make
`C` immutable, that won't work, but you can use the builder lambda pattern like
this:
C foo = [&]() -> auto {
A a;
a.set_property(value);
return MakeC(a);
}();
The anonymous lambda provides a block scope to constrain the temporary variable,
and having the lambda default capture-by-reference provides the same ability to
reference enclosing variables as a normal lexical block. Returning the result of
`MakeC()` directly into `foo` allows avoiding mutating `C`.
Note that normally, default capture by reference is
[discouraged](https://google.github.io/styleguide/cppguide.html#Lambda_expressions)
because it can create difficult lifetime problems. In this case, because the
lambda can never escape the current scope and obviously is shorter-lived than
any of the captured variables, default capture by reference is fine.