从std ::可选

发布于 2025-01-23 12:45:07 字数 245 浏览 0 评论 0原文

您实际上如何从可选的价值中获取价值?意思是将std ::可选内的值的所有权替换为std :: nullopt(或与其他值交换)?

例如,在Rust中,您可以.unwrap您的option或执行foo.take()。unwrap()之类的事情。我正在尝试使用C ++ 可选 s进行类似的事情。

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++ optionals.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

笑叹一世浮沉 2025-01-30 12:45:07

operator*/code>/value> value()返回对可选持有的值的引用,因此您可以简单地使用std ::移动将其移至临时变量,

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

这将调用operator*()可选的RVALUE参考过载,,返回对包含值的RVALUE参考。

您还可以在operator*() lvalue 可选的返回值上直接执行std ::移动,它将转换LVALUE将包含的值引用为rvalue

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

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);
撧情箌佬 2025-01-30 12:45:07

C ++替换值并返回旧的标准方法,例如mem :: Rust中的,是std :: Exchange

因此:

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

https://godbolt.org/z/g7fak9rxj

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();

https://godbolt.org/z/G7faK9rxj

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文