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

四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)

移位寄存器有哪些分类呢? 按移位方向分类:①单向移位寄存器(包括左移、右移)②双向移位寄存器 按循环方式分类:①循环移位寄存器②非循环移位寄存器 按部位的不同分类:①逻辑移位寄存器②算术移位寄存器 按输入输出方式分类:①串入串出②串入并出③并入串出④并入并出

Loudrs的博客 1万+

【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

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

qq_36773158的博客 4651

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

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

nept的博客 631

保姆级教程:用Cesium的Primitive API实现火箭发射全流程动画(含代码避坑)

本文详细介绍了如何使用Cesium的Primitive API实现火箭发射全流程动画,包括模型控制、关节动画和精细时序管理。通过实战代码示例和性能优化技巧,帮助开发者高效构建高复杂度航天仿真系统,显著提升三维可视化效果与运行效率。

weixin_42565652的博客 213

别再只会插卡了!用示波器实测SIM卡上电时序与通信波形(附故障排查)

本文深入解析了SIM卡通信的电气信号与时序规则,通过示波器实测波形揭示SIM卡上电时序与通信协议的关键细节。从VCC、CLK、RST、DATA四路信号的协同工作,到ATR(Answer to Reset)的解析,再到常见故障的波形诊断与排查方法,为硬件工程师提供了实用的调试指南。文章还分享了高级调试技巧与现代化工具链搭建建议,帮助提升物联网设备SIM卡通信的可靠性与效率。

weixin_42567279的博客 327

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

SIwave学习记录:电热耦合仿真

SIwave电热耦合仿真

m0_68174736的博客 2336

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

SAP 联产品测试

最近领导一直要求研究一下SAP联产品的使用场景,之前只是自己摸索过一次,这个重新对联产品进行一个测试。 1、首先准备好物料主数据 注意主数据中需要勾选联产品标识。 设置好物料的分摊的百分比。 2、检查BOM 在BOM中也需要维护联产品的标识 只有当组件数量未负数时,才能勾选联产品的标识。如果组件数量正值,勾选联产品的标识时会报错。 3、我们创建生产订单 可以看到按正常的生产订单下达时,系统就报错了,问题点在于离散制造的生产订单基本是结算到物料的。但是联产品是按订单结算的, 所以需要对订单类型中的结算参

我小时候很黑的博客 2110

Docker 环境 Playwright MCP 部署全流程指南

Docker部署Playwright MCP全流程指南 本文详细介绍了使用Docker容器化部署Playwright MCP的完整流程,涵盖镜像拉取、容器启动、配置优化和问题排查。主要内容包括: 核心部署步骤:通过官方镜像快速搭建环境,支持自定义端口和数据持久化 关键配置要点:详解网络设置、持久化目录挂载和环境变量配置 服务验证方法:通过日志检查和服务连通性测试确保部署成功 客户端集成:提供VS Code等IDE的配置示例 常见问题解决:针对浏览器启动超时、跨域限制等问题给出解决方案 实战案例:演示自动化爬

勤奋的码农 1474

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

Amber&pdb4amber | 准备PDB文件

PDB文件中唯一需要或有用的数据来设置AMBER模拟是:原子名称,残基名称,也许还有链标识符(如果存在多条链),以及重原子的坐标。除非加载额外的文库,否则非蛋白质结构(特别是低分子量配体)会引起问题;如果它们在PDB文件中的名称对应于AMBER库中的内部名称,则通常会识别水和单原子离子。–dry选项移除结构中的结晶水和–reduce选项在最理想的位置添加氢原子.为tleap程序调整从外部获得的PDB文件。

ASKCOS博客 897

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

weixin_34216196的博客 395

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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、付费专栏及课程。

余额充值