在 C++ 中,右值引用是一種新的特性,主要用于支持移動語義和完美轉發。以下是右值引用的一些常見用法:
使用右值引用可以實現移動構造函數和移動賦值運算符,從而避免不必要的拷貝操作,提高程序的性能。例如:
class MyString {
public:
// 移動構造函數
MyString(MyString&& other) : data(other.data), size(other.size) {
other.data = nullptr;
other.size = 0;
}
// 移動賦值運算符
MyString& operator=(MyString&& other) {
if (this != &other) {
delete[] data;
data = other.data;
size = other.size;
other.data = nullptr;
other.size = 0;
}
return *this;
}
private:
char* data;
size_t size;
};
使用右值引用和 std::forward 函數可以實現完美轉發,即將參數以原始形式傳遞給其他函數,保留參數的類型和值類別(左值或右值)。例如:
template<typename T, typename U>
void wrapper(T&& arg1, U&& arg2) {
function(std::forward<T>(arg1), std::forward<U>(arg2));
}
使用右值引用可以定義臨時對象的刪除器,從而避免臨時對象在離開作用域時被銷毀。例如:
class MyClass {
public:
// 刪除器
~MyClass() {
std::cout << "MyClass object destroyed" << std::endl;
}
};
// 右值引用
typedef std::unique_ptr<MyClass, MyClassDeleter> MyClassPtr;
// 刪除器定義
struct MyClassDeleter {
void operator()(MyClass* ptr) const {
delete ptr;
}
};