左值是可取地址的持久对象,右值是临时值;C++11通过右值引用实现移动语义,避免资源复制,提升性能,结合完美转发保持参数属性。

C++ 中的左值(lvalue)和右值(rvalue)是理解赋值操作、函数参数传递以及现代 C++ 移动语义的关键概念。它们的区别直接影响资源管理效率,尤其是在处理临时对象和大对象时。
左值是指有明确内存地址、可以被取地址的对象。它通常代表一个持久存在的值,可以在表达式多次使用。
例如:
右值是指临时的、即将销毁的值,通常没有名字,不能被取地址。
立即学习“C++免费学习笔记(深入)”;
例如:
关键点: 左值能放在赋值号左边,右值只能放在右边(C++11 前),但 C++11 引入了右值引用后,右值也可以被“绑定”并延长生命周期。
C++11 引入了右值引用(T&&),用于捕获即将销毁的右值对象,从而实现移动语义(move semantics)。
传统拷贝构造函数会深拷贝资源(如堆内存、文件句柄等),而移动构造函数则“窃取”源对象的资源,避免不必要的复制。
示例:
class MyString {
char* data;
public:
// 拷贝构造(深拷贝)
MyString(const MyString& other) {
data = new char[strlen(other.data) + 1];
strcpy(data, other.data);
}
<pre class='brush:php;toolbar:false;'>// 移动构造(转移资源)
MyString(MyString&& other) noexcept {
data = other.data; // 窃取指针
other.data = nullptr; // 防止原对象释放资源
}};
当返回一个局部对象或用 std::move 显式转换时,会触发移动构造:
移动语义极大提升了性能,尤其在以下场景:
移动后原对象处于“有效但未定义状态”,不能再使用其值,但可安全析构或赋新值。
结合模板和右值引用,C++ 实现了完美转发(std::forward),保持实参的左右值属性。
例如:
template<typename T>
void wrapper(T&& arg) {
some_func(std::forward<T>(arg)); // 保持原始类型
}
这里的 T&& 是“通用引用”(universal reference),可根据传入的是左值还是右值推导为左值引用或右值引用。
基本上就这些。理解左值/右值、右值引用和移动语义,是掌握现代 C++ 资源管理的核心。不复杂但容易忽略细节。
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号