c – 如何从std :: optional中获取QByteArray并离开std :: nullo
发布时间:2020-12-16 10:14:50 所属栏目:百科 来源:网络整理
导读:我需要编写一个函数来获取可选的 QByteArray的底层数组的所有权. 在Rust中,它是通过这种方式完成的: fn my_func(f: mut OptionBox[u8]) - Box[u8] { //how to do "take" in c++17? f.take().unwrap()} 我知道std :: move,但据我了解,这段代码将为新数组的ma
我需要编写一个函数来获取可选的< 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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |