gpt4 book ai didi

c++ - 如何从 std::optional 中获取 QByteArray 并在没有额外 malloc 的情况下保留 std::nullopt?

转载 作者:太空狗 更新时间:2023-10-29 19:45:18 35 4
gpt4 key购买 nike

我需要编写一个函数来获取 optional<QByteArray> 的所有权的底层数组。

在Rust中,是这样实现的:

fn my_func(f: &mut Option<Box<[u8]>>) -> Box<[u8]> {
//how to do "take" in c++17?
f.take().unwrap()
}

我知道 std::move ,但据我了解,此代码将 malloc新数组的数据、交换指针并删除不需要的 QByteArray :

std::optional<QByteArray> optarr = ...
QByteArray optarr = std::move(*myopt);
optarr.reset()

有什么方法可以像在 Rust 中一样做到这一点(也就是说,不为临时 QByteArray 分配内存)?

最佳答案

C++ 中等效的 函数是:

auto func(optional<QByteArray>&& o) -> QByteArray
{
return std::move(o).value();
}

std::move(o)给你一个 optional<QByteArray> 类型的右值.正在调用 value()在那个右值上给你一个 QByteArray&& (如果 o 未启用则抛出)。 QByteArray 类型的右值用于移动构造返回对象。这种移动构造很便宜,只需几个指针分配 - 不会发生内存分配。


几乎等同。注意 o这里不是以一个脱离的状态结束optional ,与 Rust 不同。它仍然订婚,只是拿着一个空的QByteArray .如果真的需要,真正等效的是:

auto func(optional<QByteArray>&& o) -> QByteArray
{
QByteArray result = std::move(o).value(); // NB: not a reference
o.reset(); // or '= nullopt', or '= {}'
return result; // NB: no need to move
}

关于c++ - 如何从 std::optional<QByteArray> 中获取 QByteArray 并在没有额外 malloc 的情况下保留 std::nullopt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51400833/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com