这是因为 T&& 是一个万能引用(Universal Reference)的语法,它可以同时接受左值和右值。万能引用是由 Scott Meyers 在他的 C++11 新特性中提出的,它是通过使用模板和引用折叠来实现的。

万能引用(Universal Reference)和右值引用(Rvalue Reference)都是 C++11 中引入的新特性,它们都使用了 && 符号,但它们的含义和用法是不同的。

万能引用是一种特殊的右值引用,它可以同时绑定到左值和右值。万能引用通常用于实现完美转发,它可以将函数参数以原始的形式转发给其他函数,而不会丢失任何信息或进行不必要的拷贝。

  1. 绑定对象的类型不同:右值引用只能绑定到右值,而万能引用可以同时绑定到左值和右值。
  2. 用途不同:右值引用通常用于实现移动语义和完美转发,而万能引用主要用于实现完美转发。
  3. 推导规则不同:右值引用的类型可以直接通过声明时加上 && 符号来指定,而万能引用的类型必须通过模板类型推导来确定。

总之,右值引用和万能引用都是 C++11 中非常重要的新特性,它们可以帮助我们编写更加高效和灵活的代码。但是,由于它们的语法比较复杂,因此需要谨慎使用,并遵循一些最佳实践,以避免出现一些常见的陷阱和错误。

下面的例子可以看出万能引用与右值引用的区别

#include <iostream>
using namespace std;

template <typename T>    // 类模板
class myclass
{
public:
  void myfunc1(T&& x)    // 右值引用
  {
    cout << x << endl;
    return;
  }

  template <typename U>
  void myfunc2(U&& val)    // 万能引用
  {
    cout << val << endl;
    return;
  }
};

int main()
{
  int i = 180;
  
  myclass<int> mc;
  mc.myfunc1(120); // ok
  mc.myfunc1(i); // error

  mc.myfunc2(120); // ok
  mc.myfunc2(i); // ok

    return 0;
}