C++11新特性之右值引用

  • 什么是左值,什么是右值?
    An l-value expression refers to an object's identity, whereas a r-value expression refers to an object's value.
    左值标识对象的身份,右值标识对象的值(我把它理解为被对象占据的一块内存资源)。

  • 常见的左值有“变量名”,常见的右值有“字面量”或者“变量经std::move转换的结果”。

  • C++11增加了对右值引用的支持,右值引用是干什么的呢?

    从字面意思理解,右值引用当然是用来标识一个右值的身份了,通过它可以找到绑定的右值,方便对右值的读写。

  • std::move函数的作用是把一个左值转变成右值返回。

    如果返回的右值被用作了move操作(move constructor / assignment)的参数,那么原来的左值x所占有的资源已经被别的对象偷走,后面再对x操作时要明白,x的一部分资源已经不可靠了。

    如果x是stl定义的类型,stl向我们保证x的赋值和析构操作是可以正常执行的,

    如果是我们自定义类型,应该注意,move constructor / assignment操作应该保证被偷走资源的参数对象可以正常被析构。

  • 谁和谁可以绑定到一起?

int i = 10;
// 右值引用-右值
int&& rr = 42;
int&& rr1 = std::move(i);
//const左值引用--右值
const int& c = 42;
//左值引用--左值
int& lr = rr;
//注意:右值引用也是变量,所以rr是左值。
  • 右值引用常见用法

    1.如果把左值引用理解为变量的别名,那么右值引用就是资源的别名。通过右值引用可以直接操作藏在对象名后面的对象资源。

    string a = "aaa";
    string&& r = std::move(a);
    r = "rrr";
    cout << a << endl;
    /*output:
    rrr
    */

2.作为move constructor 和 move assignment的参数。

    string a("aaa");
    string b(std::move(a));
    cout << "move construct b from a, a:" << a << "\tb:" << b << endl;
    string c("ccc");
    c = std::move(b);
    cout << "move assignment c from b, b:" << b << "\tc:" << c << endl;//可见,string的拷贝赋值里,对b和c的资源指针做了swap

猜你喜欢

转载自www.cnblogs.com/meixiaogua/p/9924623.html
今日推荐