1、神马叫右值和右值引用
C++中所有的值分两种,一种叫左值(可以取地址,有名字的),一种叫右值(不可以取地址,没有名字的)。
常见的如 int a = b+c ;表达式中a 可以取地址为左值,(b+c)不可以取地址为右值。
其中,右值又分为纯右值和将亡值。
纯右值如表达式产生或函数返回值产生的临时变量、还有一些常量,如1,2,3,“abc”,这些都是右值,无法取地址,虽然占有栈的内存空间和常量区却没有名字。
将亡值,这是C++11新增的跟移动语义有关的表达式。如右值引用T&&的函数返回值,std::move()的返回值等。记着将亡值是和移动语义相关的,通常将要被移动的对象(移为他用)即可。
非常量左值只能引用非常量左值,非常量右值只能引用非常量右值。常量右值可以引用,常量右值和非常量右值,而常量左值可以引用所有(这是个万金油)。
左值引用,也是左值的别名;右值引用则是对这些不具名的右值变量的别名。
2、神马叫移动语义
拷贝构造函数中为指针成员分配新的内存再进行内容拷贝的深拷贝模式,在C++中几乎是不可违背的。但有些时候,我们并不需要这样的拷贝构造语义。比如在拷贝构造的时候,我们不再分配新的内存,而是直接借用引用对象的内存呢。这种构造方式,被称作移动构造。而这种行为,就叫“移动语义”(move semantics)。
如果有较大的内存需要处理,只使用指针的移动语义,就会对性能产生惊人的提升!
3、移动语义怎马用
T &&a = ReturnRValue();
函数返回值的生命周期,将和a 的生命周期一样。
T b = ReturnRValue();
该语句和上面相比,将多一次构造和析构。
注:主要参考《深入理解C++11》