How do you actually take a value out of optional? Meaning take ownership of the value inside the std::optional
and replace it with std::nullopt
(or swap it with another value)?
In Rust for example you could .unwrap
your Option
or do something like foo.take().unwrap()
. I'm trying to do something like that with C optional
s.
CodePudding user response:
operator*
/value()
returns a reference to the value held by the optional
, so you can simply use std::move
to move it to a temporary variable
std::optional<std::string> opt = "abc";
// "take" the contained value by calling operator* on a rvalue to optional
auto taken = *std::move(opt);
This will invoke the rvalue reference overload of operator*()
of the optional,
which returns an rvalue reference to the contained value.
You can also directly perform std::move
on the return value of the operator*()
of the lvalue optional
, which will convert the lvalue reference of the contained value into an rvalue
auto taken = std::move(*opt);
CodePudding user response:
The standard way in C to replace a value and return the old, like mem::replace
in Rust, is std::exchange
.
So:
std::exchange(o, std::nullopt).value();