右值引用
右值引用的作用
右值引用(Rvalue Reference)是 C++11 引入的重要特性,主要用于实现移动语义和完美转发。它的作用是优化资源管理、提高性能,并支持更灵活的编程模式。
1. 右值引用的定义
- 右值引用使用
&&表示,例如int&&。 - 右值引用只能绑定到右值(临时对象、字面量、即将销毁的对象等)。
- 示例:
int&& rvalue_ref = 42; // 42 是右值
实现移动语义
移动语义允许将资源(如动态内存、文件句柄等)从一个对象“移动”到另一个对象,而不是复制。通过右值引用,可以避免不必要的深拷贝,提高性能。
class MyString {
public:
MyString(const char* str) {
size = strlen(str);
data = new char[size + 1];
strcpy(data, str);
}
// 移动构造函数
MyString(MyString&& other) noexcept {
data = other.data; // 转移资源
size = other.size;
other.data = nullptr; // 置空原对象
other.size = 0;
}
~MyString() {
delete[] data;
}
private:
char* data;
size_t size;
};
MyString a("Hello");
MyString b(std::move(a)); // 使用移动构造函数
实现完美转发
完美转发是指在函数模板中将参数原封不动地传递给另一个函数,保留其值类别(左值或右值)。通过右值引用和 std::forward,可以实现完美转发
template<typename T>
void wrapper(T&& arg) {
// 将 arg 完美转发给另一个函数
another_function(std::forward<T>(arg));
}
void another_function(int& x) { std::cout << "Lvalue: " << x << std::endl; }
void another_function(int&& x) { std::cout << "Rvalue: " << x << std::endl; }
int main() {
int x = 42;
wrapper(x); // 传递左值
wrapper(42); // 传递右值
return 0;
}

浙公网安备 33010602011771号
ヾ(≧O≦)〃嗷~