卡码笔记
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
  • 基础与语法

  • 面向对象

  • STL 与容器

  • 内存管理

  • C++11 与现代 C++

    • C++11中的新特性有哪些
    • C++11中的多线程编程
    • 左值引用和右值引用的区别
    • 移动语义有什么作用,原理是什么
    • 完美转发的作用及实现
    • 说一下c++中stdmove与stdforward的区别
      • 简要回答
      • 详细回答
      • 代码示例
      • 知识拓展
    • 说一下lambda函数
    • 仿函数与lambda性能对比
    • c++中 STL中仿函数与lambda表达式的性能对比
    • C++中的RAII机制
    • C++中的异常处理机制
    • C++中的协程概念及实现
  • 智能指针

  • 并发与 I/O

# c++中 std::move与std::forward的区别

面试时没有回答好问题是很正常的,被面试官质疑时,要有今天不会明天会的底气,面后做好复盘,不在同一道题目上跌倒第二次,今天就从std::move和std::forward的区别 背起来

# 简要回答

std::move无条件将参数转换为右值引用,用于表示对象可被移动

std::forward有条件地将参数转换为右值引用,用于完美转发参数原始值类别

可以理解为:std::move是"强制搬家",告诉编译器这个对象可以搬走;std::forward是"智能传递",保持参数原来的"可搬"或"不可搬"状态

# 详细回答

std::move和std::forward都是C++11引入的类型转换工具,但用途不同:

1.std::move:

执行无条件转换:无论输入是什么,都返回右值引用

实现方式:static_cast<typename std::remove_reference<T>::type&&>(t)

语义含义:明确表示对象可以被移动,资源可以被转移,使用后原对象处于有效但未指定状态

2.std::forward:

执行有条件转换:仅当原始参数是右值时才转换为右值引用

实现方式:依赖于模板参数推导和引用折叠规则

语义含义:保持参数的原始值类别(左值/右值),实现完美转发,主要用于模板函数中转发参数到其他函数

# 代码示例

#include <utility>
#include <iostream>

void process(int& lval) { std::cout << "处理左值\n"; }
void process(int&& rval) { std::cout << "处理右值\n"; }

template<typename T>
void forwarder(T&& arg) {
    std::cout << "使用forward: ";
    process(std::forward<T>(arg));  // 保持arg的原始值类别

    std::cout << "使用move: ";
    process(std::move(arg));        // 强制转为右值
}

int main() {
    int x = 10;

    std::cout << "传递左值:\n";
    forwarder(x);

    std::cout << "\n传递右值:\n";
    forwarder(20);

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
传递左值:
使用forward: 处理左值
使用move: 处理右值

传递右值:
使用forward: 处理右值
使用move: 处理右值
1
2
3
4
5
6
7

# 知识拓展

  • 知识图解

image

  • 适用场景

std::move: 明确要转移对象所有权时, 在返回局部对象时优化返回语句, 在容器操作中提高效率(如vector::push_back)

std::forward: 编写转发函数模板时, 实现工厂函数, 编写包装器或装饰器

  • 面试官可能追问

Q1: 为什么std::forward通常只用于模板函数?

A1: 因为std::forward依赖模板参数推导和引用折叠规则来保持值类别,非模板函数无法自动推导参数原始类型。

Q2: 使用std::move后原对象会怎样?

A2: 原对象处于有效但未指定状态,通常应为空或默认状态,不应再使用除非重新赋值。

Q3: 能否对const对象使用std::move?

A3: 可以,但移动操作会退化为拷贝操作,因为移动构造函数/赋值运算符通常不接受const右值引用。

Last Updated: 3/10/2026, 6:08:48 PM

← 完美转发的作用及实现 说一下lambda函数 →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪