精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容
最近看httplib的源代码,里面用到了右值引用&&和move,研究codeproject和MSDN后,说一些理解,帮助大家提升C++水平。
右值引用和左值引用结合理解,左值引用&是有地址变量对象的引用,变量对象出现在等号左边,而右值引用目标是文本数值和数据态集合,出现在等号右边。具体的定义,参考MSDN右值引用。
右值引用可将左值和右值区分开。 为了提高应用程序的性能,它们可以消除不必要的内存分配和复制操作需求。 它们还允许编写接受任意参数的函数。 该函数可以将它们转移到另一个函数,就像直接调用了另一个函数一样。。
正因为有这些优势,httplib里把右值引用和move结合提供了性能,代码如下:
1、构造函数:
Result(std::unique_ptr<Response> &&res, Error err, Headers &&request_headers = Headers{}) : res_(std::move(res)), err_(err), request_headers_(std::move(request_headers)) {}
2、使用构造函数:
inline Result ClientImpl::send_(Request &&req) { auto res = detail::make_unique<Response>(); auto error = Error::Success; auto ret = send(req, *res, error); return Result{ret ? std::move(res) : nullptr, error, std::move(req.headers)}; }
构造函数参数res和request_headers都是&&右值引用,对变量初始化时使用了move,而send_函数最后一句使用构造函数调用,调用语句内部也使用了move。
函数调用时使用move和构造函数内部初始化时都使用move,不冲突,右值引用支持这类操作,就像左值引用可以再被左值引用一样。