📅  最后修改于: 2023-12-03 14:59:50.027000             🧑  作者: Mango
在C++中,表达式可以划分为左值和右值。
左值指的是可以接受地址的表达式,简单的例子是一个变量。左值表达式居于赋值运算符左边。
右值指的是不能接受地址的表达式,例如字面量。右值表达式居于赋值运算符右边。
左值引用使用符号&
,可以将一个左值绑定到一个引用变量上。
int x = 42;
int &y = x;
在上面的代码中,&y
是一个左值引用,将x
绑定到一个新变量y
上。
使用引用可以避免代码中可能出现的指针操作,该引用变量是对存储区域的一个别名,修改一处则全局生效。
右值引用使用符号&&
,可以将一个右值绑定到一个引用变量上。
int &&z = 42;
在上面的代码中,&&z
是一个右值引用,将一个整数字面量42
绑定到一个新变量z
上。
右值引用通常与移动语义和完美转发相关。移动语义是指在复制对象时,将资源从源对象移动到目标对象,而不是创建一个新的对象并复制资源。完美转发用于保留参数信息并传递函数的调用。
class Foo {
public:
Foo() { /* constructor */ }
Foo(const Foo &f) { /* copy constructor */ }
Foo(Foo &&f) { /* move constructor */ }
};
void bar(Foo &&f) { /* move f to a new object */ }
int main() {
Foo x;
bar(std::move(x)); // move x to bar
}
在上面的代码中,当变量x
被移动到函数bar
时,将调用Foo
的移动构造函数而不是复制构造函数,这提高了程序的效率。