C++万能引用的用法(附带实例)
C++11 引入了“万能引用”的概念,万能引用也称为转发引用或通用引用,其语法形式为“T&&”。
万能引用可以绑定到左值或右值上,具体取决于 T 的推导类型:
因此,万能引用也被称为“双向引用”。
万能引用的主要作用是用于完美转发(Perfect Forwarding),即将参数以原来的形式(左值或右值)转发给其他函数。这在特性模板编程中特别有用,因为模板函数通常需要将参数原封不动地转发给其他函数,以保证参数的类型和值类别不发生改变。
万能引用的实现原理依赖于 C++11 的类型推导和引用折叠规则。在类型推导时:
万能引用的语法形式为“T&&”,其中 T 是一个模板类型参数。当使用万能引用作为函数模板参数时,可以使用 std::forward<>() 模板函数将参数以原来的形式转发给其他函数,示例代码如下:
需要注意的是,万能引用和右值引用的形式非常类似。万能引用需要在模板函数中进行引用,如果“&&”不在模板函数中,则是右值引用。
例如,在下面的代码中 func_a() 函数是右值引用,而 func_b() 函数是万能引用:
C++11 的万能引用提供了一种灵活的方式来处理函数参数的类型和值类别,使模板编程更加简洁和高效。同时,万能引用也是 C++11 中引入的完美转发机制的基础之一,在此后的设计模式模块设计中大量地使用了完美转发机制。
万能引用可以绑定到左值或右值上,具体取决于 T 的推导类型:
- 当 T 为左值类型时,T&& 就成为左值引用;
- 当 T 为右值类型时,T&& 就成为右值引用。
因此,万能引用也被称为“双向引用”。
万能引用的主要作用是用于完美转发(Perfect Forwarding),即将参数以原来的形式(左值或右值)转发给其他函数。这在特性模板编程中特别有用,因为模板函数通常需要将参数原封不动地转发给其他函数,以保证参数的类型和值类别不发生改变。
万能引用的实现原理依赖于 C++11 的类型推导和引用折叠规则。在类型推导时:
- 如果初始化表达式是左值,则 T 被推导为左值类型;
- 如果初始化表达式是右值,则 T 被推导为右值类型;
-
在引用折叠规则中,当两个引用叠加在一起时:
- 如果两个引用都是左值引用或都是右值引用,则结果为左值引用;
- 如果一个是左值引用,另一个是右值引用,则结果为右值引用。
万能引用的语法形式为“T&&”,其中 T 是一个模板类型参数。当使用万能引用作为函数模板参数时,可以使用 std::forward<>() 模板函数将参数以原来的形式转发给其他函数,示例代码如下:
template<typename T> void wrapper(T&&arg) { //使用std::forward<T>将arg以原来的形式转发给其他函数 otherFunction(std::forward<T>(arg)); }在这个例子中,wrapper() 函数接受一个万能引用参数 arg,并使用 std::forward<>() 将 arg 以原来的形式转发给其他函数。这样可以保证 arg 的类型和值类别不会被改变。
需要注意的是,万能引用和右值引用的形式非常类似。万能引用需要在模板函数中进行引用,如果“&&”不在模板函数中,则是右值引用。
例如,在下面的代码中 func_a() 函数是右值引用,而 func_b() 函数是万能引用:
template< typename PARAM> class abc { void func_a(PARAM&&a){ } //是右值引用 template < typename ARG> void func_b(ARG&&b){} //是万能引用 };
C++11 的万能引用提供了一种灵活的方式来处理函数参数的类型和值类别,使模板编程更加简洁和高效。同时,万能引用也是 C++11 中引入的完美转发机制的基础之一,在此后的设计模式模块设计中大量地使用了完美转发机制。