左值与右值:区别所在
理解值类别:左值、纯右值和将亡值
左值与右值:区别所在 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
两个世界:左值与右值
C++ 中的每个表达式要么是左值(具有名称和地址的事物),要么是右值(没有名称的临时对象)。
左值
左值表示一个持久对象——您可以使用 & 获取它的地址。
int x = 42; // x is an lvalue
int* p = &x; // taking the address of an lvalue
int& r = x; // r is an lvalue reference右值
右值是一个临时对象,例如字面量、函数返回值以及 a + b 这样的表达式。您不能获取它的地址。
int a = 5, b = 3;
int c = a + b; // (a + b) is an rvalue
// int* p = &(a + b); // ERROR: cannot take address of an rvalue为什么这种区别很重要
右值即将被销毁。我们可以安全地窃取它的资源,而不是复制资源——这就是移动语义的基础。
C++11 以来的三种类别
现代 C++ 对这一模型进行了细化:
- 左值——具有名称和身份
- 纯右值(prvalue)——纯粹的临时对象(字面量、按值返回的结果)
- 将亡值(xvalue)——即将销毁的对象(
std::move的结果)
左值引用与右值引用
左值引用使用 &;右值引用使用 &&。
int x = 10;
int& lr = x; // lvalue reference
int&& rr = 42; // rvalue reference, binds to literal绑定规则
类型兼容性:
- 左值引用(
T&)绑定到左值 - const 左值引用(
const T&)既可以绑定到左值,也可以绑定到右值 - 右值引用(
T&&)只能绑定到右值(以及将亡值)
使用 decltype 检查
您可以对表达式使用 decltype,让编译器告诉您该表达式属于哪一类。
int x = 10;
static_assert(std::is_lvalue_reference<decltype((x))>::value);
// the extra parentheses make decltype yield the lvalue refC++11 为什么加入右值引用
为了启用移动语义:接受 T&& 的构造函数可以取得临时对象的内部数据所有权,从而避免深拷贝。
常见错误:具名右值引用是左值
右值引用变量一旦声明,就拥有了名称,因此会成为左值。要将它作为右值继续传递,请使用 std::move。
void f(std::string&& s) {
// s here is an lvalue!
process(std::move(s)); // now it is an rvalue again
}完美转发预览
接受 T&& 的模板会推导出左值引用或右值引用。结合 std::forward 后,它们可以保留值类别——稍后会详细介绍。
快速检查
以下哪个表达式是右值?
回顾
左值具有名称和地址;右值是临时对象。T& 绑定到左值,T&& 绑定到右值。这种区别支持移动语义,从而避免不必要地复制临时对象。
常见问题解答
「左值与右值:区别所在」课时是免费的吗?
是的 — 「左值与右值:区别所在」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「左值与右值:区别所在」这节课中我会学到什么?
理解值类别:左值、纯右值和将亡值 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「左值与右值:区别所在」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。