右值引用与 && 语法
使用右值引用绑定临时对象,实现高效的资源转移
右值引用与 && 语法 是 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 反馈 — 无需本地设置。