1. 右值引用的本质与价值
C++11引入的右值引用(Rvalue Reference)通过双&&符号标识,其核心价值在于区分可修改的临时对象。传统C++中临时对象(如函数返回值、表达式结果)只能通过const左值引用绑定,导致大量无谓的拷贝操作。右值引用允许我们直接"窃取"这些临时对象的资源。
典型右值包括:
- 字面常量(如42、"text")
- 返回非引用类型的函数调用(如std::move())
- 算术/逻辑/比较表达式结果
- 临时对象(如vector
())
cpp复制void process(std::string&& str); // 只能接受右值
std::string generate();
process(generate()); // 合法:generate()返回右值
process("temp"); // 合法:字符串字面量是右值
关键理解:右值引用延长了临时对象的生命周期,使其在引用作用域内保持有效
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 移动语义的实战实现
移动语义通过转移资源所有权而非拷贝来实现高效传递。标准库在
移动构造函数典型实现:
cpp复制class Buffer {
char* data;
size_t size;
public:
// 移动构造函数
Buffer(Buffer&& other) noexcept
: data(other.data), size(other.size) {
other.data = nullptr; // 确保源对象处于可析构状态
other.size = 0;
}
// 移动赋值运算符
Buffer& operator=(Buffer&& other) noexcept {
if (this != &other) {
delete[] data; // 释放现有资源
data = other.data;
size = other.size;
