万能引用和完美转发
1、万能引用模板函数自动推动。#include iostream #include vector #include utility//使用std::move和std::forward等函数需要包含这个头文件 using namespace std; templatetypename T void fun(T a)//这里就是一个万能引用T a既可以接受左值也可以接受右值 { } auto var some_expression;//这里的var也是一个万能引用var既可以是左值也可以是右值 //以下就不是万能引用了 void fun(int a) {}//这里是普通的右值引用只能接受右值 templatetypename T void fun(vectorT a) {}//这也不是万能引用因为vectorT a只能接受vectorT类型的右值不能接受其他类型的右值也不能接受左值2、完美转发在函数转发参数时保留参数的原始值类别左值/右值类别和const/volatile限定符的技术通常与万能引用配合使用。#include iostream #include vector #include utility//使用std::move和std::forward等函数需要包含这个头文件 using namespace std; void overloaded(int arg) { cout 左值引用版本被调用 endl; cout arg endl; } void overloaded(int arg) { cout 右值引用版本被调用 endl; cout arg endl; } //以上2个函数arg在函数内部是一个具名对象因此它们都是左值即使在右值引用版本中arg也是一个左值 //因此在forwarder函数中如果直接传递arg给overloaded函数编译器会将arg视为一个左值导致总是调用左值引用版本 //因此我们需要使用std::forward来保持参数的值类别以确保正确调用重载函数 //万能引用 templatetypename T void forwarder(T arg) { //这里必须使用std::forward来保持参数的值类别否则会导致参数被视为左值无法正确调用重载函数 overloaded(forwardT(arg));//使用std::forward将参数完美转发给overloaded函数 } int main() { int x 10; forwarder(x);//传递一个左值调用左值引用版本 forwarder(20);//传递一个右值调用右值引用版本 forwarder(move(x));//使用std::move将x转换为右值调用右值引用版本 return 0; }3、万能引用和完美转发的主要解决的问题是避免重复的编写多个左值、多个右值参数时函数重载只需要万能引用和完美转发写一次就可以自动识别原始参数的类别是左值还是右值并自动调用正确的函数。1在构造函数中使用万能引用和完美转发#include iostream #include vector #include utility//使用std::move和std::forward等函数需要包含这个头文件 using namespace std; templatetypename T class Wrapper { public: //构造函数采用完美转发接受任意类型的参数 templatetypename U Wrapper(U value) : data(forwardU(value))//使用std::forward实现完美转发 { } private: T data; }; int main() { int x 10; return 0; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2480666.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!