[TOC]html
自从引入了这个右值引用以后,咱们把以前一般叫的引用称为左值引用。bash
左值引用:咱们以前所说的别名函数
右值引用:大部分时间和左指引用同样,可是有一点区别,他可以绑定到临时变量(右值)性能
A a;
A&& a_rref = a;
A&& temp_rref = A();
复制代码
(1)避免拷贝,提升性能,实现move()ui
(2)避免重载参数的复杂性,实现forward()this
第一个做用,就很少说了spa
第二个做用,参考[2].net
// 1.struct A没有const引用的构造函数
class A {
public:
A(int a) : num(a){}
A(A& a) : num(a.num) {}
//A(const A& a) : num(a.num) {}
A& operator=(A const & rhs) { return *this; }; // classical implementation
A& operator=(A&& rhs);
private:
int num;
};
// 2. factory 版本
// factory1
template <class T>
std::shared_ptr<T>
factory() // no argument version
{
return std::shared_ptr<T>(new T);
}
// factory2
//template <class T, class A1>
//std::shared_ptr<T>
//factory(const A1& a1) // one argument version
//{
// return std::shared_ptr<T>(new T(a1));
//}
// factory3
//template <class T, class A1>
//std::shared_ptr<T>
//factory(A1& a1)
//{
// return std::shared_ptr<T>(new T(a1));
//}
// factory4
template <class T, class A1>
std::shared_ptr<T>
factory(A1&& a1)
{
return std::shared_ptr<T>(new T(std::forward<A1>(a1)));
}
// 3.编译报错
A* q = new A(5);
std::shared_ptr<A> p = factory<A>(5);
p = factory<A>(*q);
复制代码
在calss A没有const引用的拷贝构造函数的状况下,结果是:code
(1)若是factory的const引用参数这个版本(factory2)没有的话,那么*std::shared_ptr<A> p = factory<A>(5);*就会报以下错htm
error C2664: 'std::shared_ptr<_Ty> factory<A,int>(A1 &)' : cannot convert parameter 1 from 'int' to 'int &'
复制代码
(2)若是factory的非const引用参数这个版本(factory3)没有的化,那么*p = factory<A>(*q);*这句就会报错
error C2558: class 'A' : no copy constructor available or copy constructor is declared 'explicit'
复制代码
因此,这里就引出了一个问题,若是factory的参数有不少的化,那么重载函数的数量就指数增加了。右值的做用就发挥在这里了,factory4就只须要一个就搞定了