引用折叠

默认分类 · 2024-09-01 · 108 人浏览

先来看这样一个模板函数

template <typename T>
void f(T&& t) {}

对于这样的模板参数 ,推导规则如下

  • 当传入的表达式为左值时 T 会被推导为 T&
    例如

    int a = 0;
    f(a);

    这里的 T 就会被推导为 int&

  • 当传入的表达式为右值时 T 会被推导为 T
    例如

    f(0);

    这里的 T 就会被推导为 int

对于第一种情况, T&& t 会被推导为 T& && t, 这就成了左值引用的右值引用了, 在 C++ 中 其实是不可以出现引用的引用的, 这里就提出了一个引用的概念:
如果定义出一个引用的引用,则这些引用会形成 折叠, 也就是引用折叠

  • X& &, X& &&, X&& & 会被折叠为 X&
  • X&& && 会被折叠为 X&&

只有右值引用的右值引用才会折叠成右值引用,其他情况都是左值引用
对于 T&& 参数,如果传入左值就会折叠成 int&,传入右值就会折叠成 int&&
所以 对于 T&& 类型的模板参数类型,也叫做万能引用

Theme Jasmine by Kent Liao