- 左值引用绑定左值
- 右值引用绑定右值
- const 左值引用可以绑定右值
- const 右值引用不可以绑定左值
- 万能引用既能绑定左值也能绑定右值(万能引用的前提1.一定是在模板中 2.发生了类型推导)
//这里是右值引用不是万能引用
template<class T>
void func(vector<T>&& a){}
//左值引用
template<class T>
void func(T& a){}
//右值引用 --实际上是万能引用 -- 既能绑定左值又能绑定右值
template<class T>
void func(T&& a)
template<class T>
class C1
{
public:
// 不是万能引用,是右值引用,因为在实例化C1是必须显式指定T的类型,而不是自动推导出来的
void func(T&& a){
cout << a << endl;
}
// 这里是万能引用,这种写法是类成员函数的万能引用,因为此处是函数模板,并发发生了类型推导
template<class T2>
void func2(T2&& a)
{
cout << a << endl;
}
}
// 参数加const之后由万能引用变为右值引用
template<class T>
void func(const T&& a){} // 此处是右值引用
//这种也是万能引用
auto&& x=123;
auto&& y = x;