C++11 std::bind std::ref

C++11 std::ref实战指南:如何在std::thread和std::bind中正确传递引用(附避坑案例) 本文深入解析C++11中std::ref的实战应用,指导开发者如何在std::thread和std::bind中正确传递引用,避免常见陷阱。通过代码示例展示std::ref的底层机制及其在多线程共享数据、函数组合等场景的应用,帮助C++开发者提升编程效率与代码质量。 阅读详情

std::bind 总是拷贝其参数,但是,调用者可以使用std::ref来实现传递引用给std::bind,翻译自《Effective Modern C++:改善C++11和C++14的42个具体做法》

原文如下:std::bind always copies its arguments, but callers can achieve the effect of having an argument stored by  reference by applying std::ref to it.

示例代码:

#include <iostream>
#include <functional>

void fun(int& _a, int& _b, int _c)
{
	_a++;
	_b++;
	_c++;

	std::cout << "in    fun a:" << _a << " b:" << _b << " c:" << _c << std::endl;
}

int main()
{

	int a = 1, b = 1, c = 1;
	//a被bind传值
	//b被ref传引用
	//c被fun传值
	auto b_fun = std::bind(fun, a, std::ref(b), std::ref(c));
	b_fun();

	std::cout << "after fun a:" << a << " b:" << b << " c:" << c << std::endl;

	return 0;
}

输出:

in fun a:2 b:2 c:2
after fun a:1 b:2 c:1
请按任意键继续. . .

结论:

a std::bind总是使用值拷贝的形式传参,哪怕函数声明为引用

b std::bind可以使用std::ref来传引用

c std::bind虽然使用了std::ref传递了引用,如果函数本身只接受值类型参数,传递的仍然是值而不是引用。

 

 

std::ref用法以及和&引用区别 阅读详情

相关推荐

【C++知识】 bind函数和ref函数

在ros2这种专门应用泛型编程的开发平台上,会遇到种种BOOST-C++库的应用,如果没有这种库的基础知识,开发将很吃力,建议大家专门学学BOOST C++泛型编程。

gongdiwudu的专栏 5113

解析C++中std::ref

1. 前言 关于c++中的std::ref,std::ref在c++11引入。本文通过讲解std::ref的常用方式,及剖析下std::ref内部实现,进而再来讲解下std::reference_wrapper,然后我们再进一步分析为什么使用std::ref。 2. std::ref 用法 简单举例来说: int n1 = 0; auto n2 = std::ref(n1); n2++; n1++; std::cout << n1 << std::endl; // 2 std:

leapmotion的博客 1万+

C++编程法则365天一天一条(302)std::ref引用包装器

std::ref和std::cref在函数式编程中的作用是非常大的,C++标准库中多次使用到了它们。而std::ref和std::cref事实上是模板函数,返回值是一个std::reference_wrapper对象,而std::reference_wrapper虽然是一个对象,可是他却能展现出和普通引用类似的效果,这点和前一篇文章讲的智能指针如出一辙(事实上标准库大多是这样设计的,这也是运算符重载存在的一个重要意义)。

二进制君 6391

C++ std::ref————详解

想学习ref,必须先学习reference_rapper 1、是什么? ref是个函数模板: 用来构建一个reference_wrapper对象并返回,该对象拥有传入的elem变量的引用。如果参数本身是一个reference_wrapper类型的对象,则创建该对象的一个副本,并返回。 2、为什么要有ref std::ref主要在函数式编程(如std::bind)时使用,bind是对参数直接拷贝,无法传入引用(即使你传入的实参是引用类型也不行),故引入std::ref()。使用std::ref可以在模板传参

m0_51551385的博客 1万+

C++笔记之std::move ,std::ref,std::bind

本文简要学习记录。 1、std::move 使用场景如下: (1)c++标准库使用比如vector::push_back等这类函数时,会对参数的对象进行复制,连数据也会复制。这就造成了对象内存的额外创建,本来原意是想把参数push_back进去就可以了。 (2)c++11提供了std::move函数来把左值转换为xrvalue,而且新版的push_back也支持&&参数的重载版本,这时候就可以高效率地使用内存了。 使用前提: (1)定义的类使用了资源并且定义了移动构造函数和移

deep_love1314的博客 1875

Android Studio中把llama.cpp编译Android .so

本文介绍了一个在Android Studio中集成llama.cpp的最小Demo实现方案,通过JNI将llama.cpp编译为Android.so库,实现本地加载GGUF模型进行文本生成。文章详细说明了项目结构配置(SDK≥30,NDK≥28)、CMake编译设置、Kotlin-JNI-C++的完整调用链实现,以及模型文件部署方式。该Demo采用每次请求新建上下文的简化设计,包含加载模型、生成文本、资源释放等核心功能,并提供了错误排查建议。项目舍弃了上下文保持等复杂功能以确保稳定性,适合作为端侧大语言模型

Zhang Phil 519

【C++11】C++11 std::function, std::bind, std::ref, std::cref

【C++11】C++11 std::function, std::bind, std::ref, std::cref std::function 看看这段代码 先来看看下面这两行代码: std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyReleased; 这两行代码是从Cocos2d-x中

qq_43331089的博客 333

【毕设】基于LoRa的物联网控制器:从原理图到PCB的完整硬件设计指南

本文提供了一份完整的基于LoRa的物联网控制器硬件设计指南,涵盖从系统框图、原理图设计到PCB布局布线的全流程。详细讲解了电源电路、单片机最小系统、信号接口以及LoRa无线模块等核心模块的设计要点与抗干扰技巧,并分享了实用的调试心得,旨在帮助电子、物联网专业学生顺利完成毕业设计,掌握低功耗远距离物联网节点的硬件开发实践。

weixin_42126677的博客 307

C++11 std::ref实战指南:如何在std::bind和std::thread中正确传递引用

本文深入解析C++11中std::ref的核心机制与实战应用,重点指导如何在std::bind和std::thread中正确传递引用。通过剖析值语义导致的常见陷阱,并结合代码示例,详细阐述了使用std::reference_wrapper确保函数对象与多线程编程中引用传递有效性的方法,帮助开发者编写正确、高效的C++代码。

nept的博客 631

保姆级教程:用Ubuntu 22.04搭建RustDesk中继服务器(含Cloudflare避坑指南)

本教程详细指导如何在Ubuntu 22.04上搭建RustDesk中继服务器,解决跨国远程协作的延迟问题。涵盖环境配置、Rust编译优化、服务部署及Cloudflare代理设置等关键步骤,帮助用户实现高性能的私有中继服务。

weixin_29002209的博客 527

26、机器学习模型的成员推断攻击与隐私保护

本文探讨了机器学习模型面临的成员推断攻击及其对隐私的潜在威胁。通过使用CIFAR-10数据集,详细介绍了如何利用影子模型和攻击模型推断特定数据点是否属于模型的训练集。实验表明,即使无法直接访问模型参数和原始数据,攻击者仍能以高于随机猜测的概率进行推断,从而构成隐私风险。此外,文章还分析了实验的关键技术点,并提出了多种隐私保护建议,包括数据脱敏、差分隐私、模型正则化等方法。

coffee的博客 123

C++11 std::function, std::bind, std::ref, std::cref

C++11 std::function, std::bind, std::ref, std::cref 转自:http://www.jellythink.com/ std::function 看看这段代码 先来看看下面这两行代码: std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyRelea

weixin_44966641的博客 577

轨迹优化 | 基于ESDF的共轭梯度优化算法(附ROS C++/Python仿真)

共轭梯度法的核心原理是求解优化问题的共轭向量组作为优化方向,由于优化方向间彼此正交,故每次迭代只需沿着一个方向寻优而互不影响。本文设计基于ESDF的障碍约束、曲率约束和平滑约束,基于ROS C++和Python提供了共轭梯度法的轨迹优化实践案例

FRIGIDWINTER的博客 1万+

c++11 std::bind与std::ref、std::cref

直接看代码: #include<iostream> #include<functional> using namespace std; int add(int &a,int &b) { a = 0; b = 0; return a+b; } int main() { int a = 2,b = 3; auto func1 = bi...

李白 854

Trae的付费之路还挺艰难,茫茫多的人想付付不了(附解决办法)

不得不说,Trae国际版这个付费其实整的挺复杂的,但没办法,毕竟有政策限制,付费成功后,你就是尊贵的Pro用户啦,使用Claude 4不排队还是挺爽的,而且600次其实不算少了,有一个小技巧,简单的问题就把模型切到Gemini-2.5-flag,因为使用这个模型是没有次数限制的。其次付费的时候有个ZIP Code,这东西也是个迷之存在,有的地区节点需要填,有的不需要,如果你选到了不需要填的节点,那很好,付费就行了,如果需要填,可以填一个51800试试。

cpp加油站的专栏 5881

YOLO26-seg分割优化:轻量化卷积魔改 | 新的partial convolution(PConv)结合C3k2 | CVPR2023

​​​​​摘要:本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其关键架构改进及其在实时边缘目标检测中的性能基准测试。YOLO26于2025年9月发布,是YOLO系列最新、最先进的成员,专为在边缘及低功耗设备上实现高效、精确且易于部署的目标而构建。本文依次详述了YOLO26的架构创新,包括:移除了分布焦点损失(DFL);采用端到端的无NMS推理;集成了渐进损失(ProgLoss)与小目标感知标签分配(STAL);以及引入了用于稳定收敛的MuSGD优化器。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 151

C++11 std::bind(),std::function,std::ref(),std::cref

文章目录std::bindstd::functionstd::ref();std::cref std::bind std::bind可以预先把某个可调用对象的某些参数绑定到已有的变量,产生一个新的可调用对象。bind本身是一种延迟计算的思想,它本身可以绑定普通函数、全局函数、静态函数、类静态函数甚至是类成员函数。bind最终将会生成一个可调用对象,这个对象可以直接赋值给std::function对象,而std::bind绑定的可调用对象可以是Lambda表达式或者类成员函数等可调用对象。 使用方式:bind

qq_37863891的博客 528

apple游客下单逆向分析

Apple游客下单Cookies注册激活流程逆向分析与算法实现

吴秋霖的博客 2001

c++11 std::ref std::cref

参考: C++已经有了引用操作符&为什么C++11还要引入std:ref std::ref和std::cref使用 &是类型说明符,而std::ref是一个函数,返回std::reference_wrapper(类似于指针) 为什么需要std::ref?(std::cref类似) 主要是考虑到c++11中的函数式编程,例如:std::bind std::...

weixin_30439131的博客 223

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++11 (三) - std::function、std::bind、std::ref

文章目录一、std::bind二、std::function三、std::ref 一、std::bind std::bind 预先把一个可调用实体的某些参数绑定到已有的变量,然后产生一个新的可调用实体,可以直接赋给 std::function 对象 std::bind 实际上是一种延迟计算的思想,将可调用对象保存起来,然后在需要的时候再调用,而且参数绑定支持占位符,std::placeholders::_1 代表这个位置将在函数调用时,被传入的第一个参数所替代 #include <iostream&

chenwh_cn的博客 519

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

std::bind 实战指南:C++11 回调机制与线程安全设计

std::bind 是 C++11 引入的核心可调用对象适配机制,其本质是类型擦除、参数重排与延迟求值的组合体。相比 lambda,它在跨线程回调、成员函数复用、多层管道构建等场景中提供更强的类型稳定性与生命周期可控性,尤其适用于 VS2017(v142 工具集)下长期维护的嵌入式或实时系统。技术价值体现在避免 this 悬空、显式管理右值移动、支持 std::ref 引用绑定等关键能力,广泛应用于 c++小游戏事件系统、工业级通信中间件及 c++11 锁协同调度等高可靠性场景。

weixin_34216196的博客 395

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

c++11 std::ref与std::reference_wrapper -- 详解

std::ref是生成对象的工具,内部存储了被包装对象的指针,使用时会通过隐式转换或get()函数,返回被包装对象的指针的解引用(

2403_87663181的博客 248

为什么C++11引入了std::ref?

本文转载自: https://www.cnblogs.com/jiayayao/p/6527713.html 如有侵权,通知删除   C++本身有引用(&),为什么C++11又引入了std::ref?   主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用。如下例子: #include #include

脱离了低级趣味的流氓 2027

为什么C++11引入了std__ref?

转载:https://www.cnblogs.com/jiayayao/p/6527713.html C++本身有引用(&),为什么C++11又引入了std::ref? 主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用。 #include <functional> #include <iostream> void f(int& n1, int& n2, const int& n3) { std::cout

yinsizhilian的博客 355

C++11实战:std::bind的5种常见用法与避坑指南(附代码示例)

本文深入解析C++11中std::bind的5种核心实战用法,包括参数绑定、成员函数绑定、与lambda的协同、引用绑定及嵌套组合,并提供详尽的避坑指南与代码示例。重点阐述了参数求值时机、对象生命周期管理及std::ref的正确使用,帮助开发者安全高效地运用这一强大工具进行回调构建与接口适配。

t1u2v的博客 639
上一篇: 【3】node.js-eCharts柱状图-加载本地-多个Excel文件
下一篇: 【3】RedisClient 数据浏览神器(支持对Redis数据进行界面化操作)
C++程序员Carea
博客等级 码龄18年 1590粉丝 878原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值