TRY avoiding copy/move

OUTCOME_TRYV(expr)/OUTCOME_TRY(expr) works by creating an internal uniquely named variable which holds the value emitted by the expression. This implies that a copy or move operation shall be performed on the object emitted (unless you are on C++ 17 or later, which has guaranteed copy elision), which may be undesirable for your use case.

You can tell OUTCOME_TRY to use a reference rather than a value for the internal uniquely named variable like this:

// This refers to a Result containing an immovable object
outcome::result<Immovable> &&res;

// For when you do want to extract the value
// This creates an auto &&unique = res, followed by an
// auto &&v = std::move(unique).assume_value()
OUTCOME_TRY((auto &&, v), res);

If you don’t care about extracting the value:

// For when you don't want to extract the value
// This creates an auto &&unique = res
OUTCOME_TRYV2(auto &&, res);