C++右值引用

Rvalue references

在C++0x中介绍了一种新的引用类型:右值引用,它帮助解决了不必要的拷贝问题和允许了完美转发的存在。当赋值的右手边(right-hand side)是一个右值时,左手边(left-hand side)的对象就可以偷走右手边对象的资源,而不是进行一次独立的分配,也就诞生了”移动语义“。

左值:可以出现在 operator= 左侧者。

右值:只能出现在 operator= 右侧者。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
using namespace std;

int main() {
int a = 9;
int b = 4;
// a + b = 42; // error: lvalue required as left operand of assignment

string s1("Hello ");
string s2("World");
s1 + s2 = s2; // s1 + s2 可以当做左值!
cout << s1 << endl;
cout << s2 << endl;
string() = "World"; // 可以对临时对象赋值!
}

C++在用户自定义类型中会产生一些细微的问题,这些问题有关于修改或赋值动作。这种问题就导致上面的定义不正确。

(但是仍然应把临时对象认为是右值。)

当右值出现在 operator= (拷贝赋值,copy assignment)的右侧,我们认为对资源进行偷取/搬移(move)而非拷贝(copy)是合理的。则

  1. 必须有语法让我们在调用端告诉编译器“这是个右值”
  2. 必须有语法让我们在被调用端写出一个专门处理右值的所谓移动赋值(move assignment)函数
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×