微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 如何从std :: optional中获取QByteArray并离开std :: nullopt而不使用额外的mallocs?

我需要编写一个函数获取可选的< 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)为你提供了一个可选< QByteArray>类型的右值.在该右值上调用value()可以得到QByteArray&& (如果o被解除,则抛出). QByteArray类型的右值用于移动构造返回对象.这种移动结构很便宜,只需几个指针分配 – 不会发生内存分配.

†几乎相当于.请注意,o不像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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐