在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b+c)这样的操作则不会通过编译。
1 int &a = 2; // 左值引用绑定到右值,编译失败 2 3 int b = 2; // 非常量左值 4 const int &c = b; // 常量左值引用绑定到非常量左值,编译通过 5 const int d = 2; // 常量左值 6 const int &e = c; // 常量左值引用绑定到常量左值,编译通过 7 const int &b =2; // 常量左值引用绑定到右值,编程通过
int a = 1; int &&r1 = a; // 编译失败 int &&r2 = std::move(a); //将左值转变为右值编译通过