0Pricing
C++ Academy · 课时

右值引用与 && 语法

使用右值引用绑定临时对象,实现高效的资源转移

右值引用与 && 语法 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

&& 语法

右值引用使用 T&& 声明。它只能绑定到右值,即即将销毁的临时对象。

int&& ref = 42;          // OK: binds to literal
int x = 10;
// int&& bad = x;        // ERROR: x is an lvalue

为什么需要右值引用

右值引用让您可以编写知道参数即将被销毁的函数。这样,您就可以取得参数的资源,而无需进行复制。

按引用类型重载函数

您可以分别针对 T& 和 T&& 重载函数。编译器会根据参数的值类别选择正确的版本。

void process(std::string& s) { std::cout << "lvalue\n"; }
void process(std::string&& s) { std::cout << "rvalue\n"; }

std::string s = "hi";
process(s);            // lvalue
process("temp");       // rvalue
process(std::move(s)); // rvalue

具名右值引用会变成左值

一旦为右值引用赋予名称,该名称本身就是左值——它的身份已经确定。请使用 std::move 恢复其右值属性。

void f(std::string&& s) {
    // inside f, the parameter s is an lvalue
    g(s);              // passes s by lvalue
    h(std::move(s));   // passes s as an rvalue
}

std::move 是一种类型转换

std::move(x) 本身不会移动任何东西——它是一种类型转换,会将 x 作为右值引用返回。实际的移动操作发生在接收方的构造函数中。

// equivalent to
static_cast<std::string&&>(s)

为什么称为移动

这个名称反映了它的典型用法——传递一个您打算窃取其内容的对象——但它本身不会转移任何东西。

通用引用(转发引用)

当 T&& 出现在一个能够推导出 T 的模板中时,它就是转发引用——既可以绑定到左值,也可以绑定到右值,同时保留值类别。

template <typename T>
void wrapper(T&& arg) {
    process(std::forward<T>(arg));
}

引用折叠

当引用通过模板叠加时,语言会将它们折叠:

  • T& & → T&
  • T& && → T&
  • T&& & → T&
  • T&& && → T&&

何时不应使用移动

对于可平凡复制的类型(int、double、指针),移动与复制相同。调用 std::move 没有任何好处,还可能让读者感到困惑。

不拥有资源时的移动

对于不包含堆资源的类型,移动构造函数与复制构造函数相同。移动只有在类型拥有动态内存时才有益处。

常见陷阱:从 const 对象移动

对 const 对象使用 std::move 不会产生作用——移动构造函数不能用于 const 对象,因为它需要修改源对象。

快速检查

std::move(x) 实际执行了什么操作?

回顾

T&& 绑定到右值。具名右值引用会变成左值——请使用 std::move 恢复其右值属性。模板中的 T&& 是转发引用。std::move 是一种类型转换;它本身不会执行移动操作。

常见问题解答

「右值引用与 && 语法」课时是免费的吗?

是的 — 「右值引用与 && 语法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「右值引用与 && 语法」这节课中我会学到什么?

使用右值引用绑定临时对象,实现高效的资源转移 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「右值引用与 && 语法」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 左值与右值:区别所在
  2. 右值引用与 && 语法
  3. std::move 与 std::forward
  4. 移动构造函数与移动赋值
← 返回 C++ Academy