右值引用

右值引用的作用

右值引用(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;
}
posted @ 2025-01-23 17:10  陈浩辉  阅读(68)  评论(0)    收藏  举报
ヾ(≧O≦)〃嗷~