C++ | 左值引用 与 右值引用

(参考自博客:【译】VC10中的C++0x特性 part 1:Lambdas,auto,以及 static_assert)

& 声明的引用类型被称作 lvalue 引用,而用 && 声明的引用类型被称作 rvalue 引用。
(“lvalue ”,即“Left value” 左值; “rvalue ”,即“Right value” 右值。)

两条规则:

  • 遵守 const 正确性,所以不能把非常量引用绑定到常量上。
  • 避免意外修改临时对象,所以不能把非常量 lvalue 引用绑定到非常量 rvalue 上来。

通过博客中提供的代码:

#include 
using namespace std;

string modifiable_rvalue() {
    return "cute";
}

const string const_rvalue() {
    return "fluffy";
}

int main() {
    string modifiable_lvalue("kittens");
    const string const_lvalue("hungry hungry zombies");

    string& a = modifiable_lvalue;          // Line 16
    string& b = const_lvalue;               // Line 17 - ERROR
    string& c = modifiable_rvalue();        // Line 18 - ERROR
    string& d = const_rvalue();             // Line 19 - ERROR

    const string& e = modifiable_lvalue;    // Line 21
    const string& f = const_lvalue;         // Line 22
    const string& g = modifiable_rvalue();  // Line 23
    const string& h = const_rvalue();       // Line 24

    string&& i = modifiable_lvalue;         // Line 26 - ERROR IN MSVC C++17
    string&& j = const_lvalue;              // Line 27 - ERROR
    string&& k = modifiable_rvalue();       // Line 28
    string&& l = const_rvalue();            // Line 29 - ERROR

    const string&& m = modifiable_lvalue;   // Line 31 - ERROR IN MSVC C++17
    const string&& n = const_lvalue;        // Line 32 - ERROR IN MSVC C++17
    const string&& o = modifiable_rvalue(); // Line 33
    const string&& p = const_rvalue();      // Line 34
} 

分析上述代码可得

表 1 C++左值引用和右值引用
引用类型 可以引用的值类型 使用场景
非常量左值 常量左值 非常量右值 常量右值
非常量左值引用
Type&
Y N N N
常量左值引用
const Type&
Y Y Y Y 常用于类中构建拷贝构造函数
非常量右值引用
Type&&
N N Y N 移动语义、完美转发
常量右值引用
const Type&&
N N Y Y 无实际用途

非常量左值引用 Type&

非常量 lvalue 引用( Type& ) 只能绑定到非常量 lvalue 。

	// 1. 非常量 lvalue 引用( Type& ) 只能绑定到非常量 lvalue
	int a = 10;
	int& b = a;
	//int& c = 10;		// 非常量左值引用 无法 绑定到右值

https://blog.csdn.net/tonglin12138/article/details/91479048

http://c.biancheng.net/view/7829.html

右值引用使用示例
移动拷贝构造、移动赋值函数。

你可能感兴趣的:(c++,开发语言,后端)