从 std::optional 中提取价值

Take value out of std::optional

你实际上是如何从 optional 中取出一个值的?意思是获取 std::optional 中的值的所有权并将其替换为 std::nullopt(或将其替换为另一个值)?

例如,在 Rust 中,您可以 .unwrap 您的 Option 或做类似 foo.take().unwrap() 的事情。我正在尝试用 C++ optionals.

做类似的事情

operator*/value() return是对optional持有的值的引用,所以你可以简单地使用std::move将它移动到一个临时变量

std::optional<std::string> opt = "abc";
// "take" the contained value by calling operator* on a rvalue to optional
auto taken = *std::move(opt);

这将调用 optional,operator*() 的右值引用重载,其中 return 是对包含值的右值引用。

也可以直接对左值optionaloperator*()的return值执行std::move,将包含值的左值引用转换为右值

auto taken = std::move(*opt);

C++ 中替换值和 return 旧值的标准方法,如 Rust 中的 mem::replace,是 std::exchange.

所以:

std::exchange(o, std::nullopt).value();

https://godbolt.org/z/G7faK9rxj