C++ 11右值引用与移动语义 -----上


1、介绍

  右值引用是C++11的新特性,初次接触觉得很难理解。因此我们将不直接给出右值引用的定义,而是从没有引入右值引用之前存在的问题,引入右值引用之后问题是如何解决的。
  在 C语言 最原始的定义中,左值可以位于赋值运算符左边或者右边;右值只能位于赋值运算符右边。

int a = 42;
int b = 43;
// a, b 都是左值

  a = b; // ok
  b = a; // ok
  a = a * b; // ok

  // a * b 是右值:
  int c = a * b; // ok, 右值位于赋值运算符的右边,正确的
  a * b = 42; // error, 右值位于赋值运算符的左边,错误的

   但是在 C++ 中,由于用户自定义的类型,使得这里左值、右值的定义存在一些问题。左值表示存储在计算机内存的对象,可以被取地址;右值相当于内存地址中的数据,不能被取地址。看下面的代码实例:

  int i = 42;
  i = 43; // ok, 左值位于赋值运算符的左边,正确的
  int* p = &i; // ok, 左值可以被取地址
  int& foo();
  foo() = 42; // ok, foo() 是一个左值
  int* p1 = &foo(); // ok
// --------------------------------------------
  int foobar();
  int j = 0;  //j 是左值
  j = foobar(); // ok, 这里foobar() 是一个 ** 右值 **
  int* p2 = &

你可能感兴趣的:(c++,右值引用,移动语义,move,c++11新特性)