首页 > 编程笔记 > C++笔记 阅读:16

C++万能引用的用法(附带实例)

C++11 引入了“万能引用”的概念,万能引用也称为转发引用或通用引用,其语法形式为“T&&”。

万能引用可以绑定到左值或右值上,具体取决于 T 的推导类型:
因此,万能引用也被称为“双向引用”。

万能引用的主要作用是用于完美转发(Perfect Forwarding),即将参数以原来的形式(左值或右值)转发给其他函数。这在特性模板编程中特别有用,因为模板函数通常需要将参数原封不动地转发给其他函数,以保证参数的类型和值类别不发生改变。

万能引用的实现原理依赖于 C++11 的类型推导和引用折叠规则。在类型推导时:
万能引用的语法形式为“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 中引入的完美转发机制的基础之一,在此后的设计模式模块设计中大量地使用了完美转发机制。

相关文章