C++面试题更新 2026-08-05

请解释 C++ 中的左值(lvalue)与右值(rvalue)分别代表什么含义,二者之间存在哪些关键区别?

技术原理C++

考察说明

考察对 C++ 值类别基本概念的理解及其区别,属于语言基础与底层机制考查。

回答思路

  1. 【回答框架 1】左值通常指表达式结束后依然存在的对象,具有名字和可寻址性,例如变量名、解引用指针等;右值则是表达式结束后即销毁的临时值,如字面常量、算术表达式结果等。二者最核心的区别在于生命周期与可否取地址。
  2. 【回答框架 2】在 C++11 之后,值类别细分为左值、纯右值、将亡值等。传统上左值可以取地址,右值不能;但将亡值虽然不能直接取地址,却可以被移动。现代理解更侧重能否被移动、是否具有持久身份。
  3. 【回答框架 3】在实际编程中,重载函数参数时,左值引用只能绑定左值,右值引用只能绑定右值,通过 std::move 和 std::forward 参数转发实现移动语义与完美转发,从而避免不必要的拷贝。
  4. 【回答框架 4】还有一条经验法则:若表达式可以取地址,则通常是左值;反之则是右值。但需要注意字符串字面量是左值(类型为 const char 数组),而其他字面量如数字 1 是右值。
  5. 【关键点 1】左值可寻址且生命周期较长,右值通常是临时值,生命周期短。
  6. 【关键点 2】C++11 以后左值与右值并非绝对二分,还包括将亡值等,更强调移动语义。
  7. 【关键点 3】函数重载依据左值引用与右值引用匹配不同实参。
  8. 【易错点 1】误将字符串字面量当右值,实际它是左值。
  9. 【易错点 2】混淆 std::move 与移动构造函数:std::move 只是类型转换,不会真正移动数据。
  10. 【易错点 3】认为右值所在表达式结束后一定销毁,但若被移动或引用延伸则例外。