21xrx.com
2024-09-20 05:38:19 Friday
登录
文章检索 我的文章 写文章
C++中的万能引用作为模版参数的使用
2023-07-11 18:49:32 深夜i     --     --
C++ 万能引用 模版参数

C++中的万能引用(universal reference)是指一种带有引用折叠的引用类型,它可以同时绑定到左值和右值,并且会根据实参的类型进行折叠。在模版参数的使用中,万能引用可以提供更为通用的参数类型,使函数或类模版更加灵活。

以函数模版为例,使用万能引用作为模版参数可以接受任意类型的实参,并且在模版实例化时编译器会自动推导出参数类型。例如:


template<typename T>

void foo(T&& t)

  //...

int i = 42;

const int ci = 86;

foo(i); // 参数类型为 int&

foo(ci); // 参数类型为 const int&

foo(42); // 参数类型为 int&&

在上面的例子中,`foo` 函数的模版参数 `T` 是一个万能引用,可以接受任意类型的实参。当 `i` 作为实参时,编译器会推导出 `int&` 类型;当 `ci` 作为实参时,编译器会推导出 `const int&` 类型;当 `42` 作为实参时,编译器会推导出 `int&&` 类型。

万能引用的另一个优点是可以与类型推导一起使用,可以简化模版参数的书写。例如:


template<typename Container, typename Index>

auto access(Container&& c, Index i) -> decltype(c[i]){

  return c[i];

}

int arr[] = 1;

const std::vector<int> v = 4;

std::cout << access(arr, 1) << std::endl; // 输出 2

std::cout << access(v, 2) << std::endl; // 输出 6

在上面的例子中,`access` 函数的第一个参数是一个万能引用,可以接受任意类型的容器,包括左值和右值。在函数中,可以使用 `decltype` 推导出返回值类型,从而不需要显式地指定模版参数类型。

总之,万能引用是 C++11 中引入的一个重要特性,可以提供更为灵活的参数类型,同时也有助于简化模版参数的书写。在使用万能引用时需要注意类型折叠的规则,以确保程序能够正确地推导类型。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复