MST

星途 面试题库

面试题:C++ 右值引用与完美转发基础

请解释C++中右值引用的概念,以及它与左值引用的主要区别。同时,描述完美转发在右值引用场景下的作用,并用一个简单的代码示例展示如何实现完美转发。
39.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

右值引用概念

右值引用是C++11引入的新特性,用于绑定到右值(临时对象)。它允许我们在不进行额外拷贝的情况下,高效地转移对象的资源所有权。右值引用的声明形式为 T&&,其中 T 是数据类型。

与左值引用的主要区别

  1. 绑定对象类型
    • 左值引用:只能绑定到左值(有名称、可寻址的对象,如变量),例如 int a = 10; int& ref = a;
    • 右值引用:只能绑定到右值(临时对象、字面量等),例如 int&& ref = 10;
  2. 生命周期延长
    • 左值引用:不会延长左值的生命周期。
    • 右值引用:当右值被右值引用绑定后,其生命周期会延长到与右值引用变量相同。
  3. 可修改性
    • 左值引用:通常用于避免拷贝和修改对象,左值引用所引用的对象是可修改的。
    • 右值引用:不仅可以避免拷贝,还能实现资源的转移,右值引用所引用的对象在转移后通常不再被使用,也可被修改。

完美转发在右值引用场景下的作用

完美转发指的是函数模板能够将其参数原封不动地转发给其他函数。在右值引用场景下,它的作用是在函数调用链中保持参数的左右值属性不变,使得实参无论是左值还是右值,都能被准确地转发到目标函数,避免不必要的拷贝和移动。

完美转发代码示例

#include <iostream>

// 目标函数
void printValue(int& value) {
    std::cout << "Lvalue: " << value << std::endl;
}

void printValue(int&& value) {
    std::cout << "Rvalue: " << value << std::endl;
}

// 转发函数模板
template <typename T>
void forwardValue(T&& value) {
    printValue(std::forward<T>(value));
}

int main() {
    int num = 10;
    forwardValue(num);        // 转发左值
    forwardValue(20);         // 转发右值
    return 0;
}

在上述代码中,forwardValue 函数模板使用 std::forward 实现了完美转发,使得 printValue 函数能够正确区分接收到的参数是左值还是右值。