📜  C++中带有示例的左值引用和右值引用(1)

📅  最后修改于: 2023-12-03 14:59:50.027000             🧑  作者: Mango

C++中带有示例的左值引用和右值引用
左值和右值

在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的移动构造函数而不是复制构造函数,这提高了程序的效率。

参考链接
  1. 《Effective Modern C++》