ref关键字

std::ref 是什么?

简单的一句话: std::ref 是一个包装器 ,用来告诉 std::thread(以及其他标准库函数如 std::bind):"请传递这个变量的引用(地址) ,而不是它的拷贝(副本)"。

为什么需要它?

std::thread 的构造函数在设计上非常谨慎。为了防止线程运行在分离模式(detach)下访问已经销毁的局部变量,它默认会把所有参数拷贝一份存到线程独立的存储空间里。

这就导致了一个问题:即使你在函数参数里写了 void func(int& n)

std::thread 依然会先拷贝一个副本,然后把这个副本的引用传给函数。

  • 没有 std::ref:你修改的是副本,主线程里的原始变量不会变
  • std::ref:你修改的是原始变量。
代码对比
复制代码
#include <iostream>
#include <thread>
#include <functional> // std::ref 实际上在这里,但 <thread> 通常包含了它

void worker(int& n) {
    n += 10;
}

int main() {
    int n = 0;

    // --- 错误示范 ---
    // std::thread t1(worker, n); 
    // 编译可能会报错,或者虽然编译通过,但 n 仍然是 0。
    // 因为 thread 内部机制拷贝了 n,试图把临时拷贝传给非 const 引用是非法的/无效的。

    // --- 正确示范 ---
    std::thread t2(worker, std::ref(n)); 
    t2.join();

    std::cout << "n is now: " << n << std::endl; // 输出 10
    return 0;
}

底层原理: std::ref(n) 返回一个 std::reference_wrapper<int> 对象。这个对象是可以拷贝的,但它内部保存的是 n 的指针。当它被传递给线程函数时,它会"解包"回原始的引用。

相关推荐
曾小猫6 分钟前
20编辑型描述符的使用
开发语言
禁默6 分钟前
信创实战:Python + SQLAlchemy 接入金仓数据库(从驱动安装到完整 CRUD)
开发语言·数据库·python
数字会议深科技13 分钟前
集团总部如何集中管控全国分支机构的录音?——音频采录云管方案解析
开发语言·人工智能·会议解决方案·音频采录云管方案·集团·阵列麦克风·会议设备
蒸蒸yyyyzwd18 分钟前
cpp 选手 转 ai 后端学习笔记
c++·transformer·ai编程
lingran__22 分钟前
C++ STL 关联式容器万字详解:set、multiset、map、multimap|接口用法 + 易错点 + 力扣真题实战
开发语言·c++·stl·set·map·红黑树·关联式容器
c2385630 分钟前
C/C++每日一练21
c语言·开发语言·c++
qq_4017004131 分钟前
Qt Modbus协议0x00
开发语言·qt
星轨初途32 分钟前
LeetCode 热题 100——day7 接雨水
数据结构·c++·笔记·算法·leetcode·职场和发展
yushikong32 分钟前
关于rust开发ch32x033f8p6的一些记录
开发语言·后端·rust
qeen8738 分钟前
【数据结构】搜索二叉树的介绍与算法原理解析及实现
数据结构·c++·学习·算法·模板