目录
正文示例1:输出:输出:总结正文
C++11 中引入std::ref
用于取某个变量的引用,这个引入是为了解决一些传参问题。
(资料图片仅供参考)
我们知道 C++ 中本来就有引用的存在,为何 C++11 中还要引入一个std::ref
了?主要是考虑函数式编程(如std::bind
)在使用时,是对参数直接拷贝,而不是引用。下面通过例子说明
示例1:
#include#include void f(int& n1, int& n2, const int& n3) { std::cout << "In function: " << n1 << " " << n2 << " " << n3 << "\n"; ++n1; // increments the copy of n1 stored in the function object ++n2; // increments the main()"s n2 // ++n3; // compile error } int main() { int n1 = 1, n2 = 2, n3 = 3; std::function bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3)); n1 = 10; n2 = 11; n3 = 12; std::cout << "Before function: " << n1 << " " << n2 << " " << n3 << "\n"; bound_f(); std::cout << "After function: " << n1 << " " << n2 << " " << n3 << "\n"; }
输出:
Before function: 10 11 12
In function: 1 11 12
After function: 10 12 12
上述代码在执行std::bind
后,在函数f()
中n1
的值仍然是 1,n2
和n3
改成了修改的值,说明std::bind
使用的是参数的拷贝而不是引用,因此必须显示利用std::ref
来进行引用绑定。具体为什么std::bind
不使用引用,可能确实有一些需求,使得 C++11 的设计者认为默认应该采用拷贝,如果使用者有需求,加上std::ref
即可。
#include#include #include void threadFunc(std::string &str, int a) { str = "change by threadFunc"; a = 13; } int main() { std::string str("main"); int a = 9; std::thread th(threadFunc, std::ref(str), a); th.join(); std::cout<<"str = " << str << std::endl; std::cout<<"a = " << a << std::endl; return 0; }
该程序创建一个线程 th
,调用带有两个参数的 threadFunc
函数:一个是 std::string
对象 str
的引用,另一个是整数 a
。函数 threadFunc
修改字符串 str
为 "change by threadFunc",但不修改整数 a
。最后在主线程中输出 str
和 a
的值。
输出:
str = change by threadFunc
a = 9
可以看到,和 std::bind 类似,多线程的 std::thread 也是必须显式通过 std::ref 来绑定引用进行传参,否则,形参的引用声明是无效的。
总结
std::ref
是一个 C++ 标准库函数模板,它将对象的引用转换为可复制的可调用对象。
std::ref
用于将对象的引用传递给函数或线程等可调用对象的参数。如果不使用 std::ref
,那么函数或线程会将对象的副本传递给可调用对象的参数,这可能会导致无法预期的结果,因为对该副本的修改不会影响原始对象。通过使用 std::ref
,可以确保可调用对象引用的是原始对象,因此对该对象的修改将影响原始对象。
需要注意的是,使用 std::ref
前必须确保原始对象的生命周期至少与可调用对象相同,否则会导致悬空引用。另外,std::ref
不能用于将指向临时对象或将过时对象的引用传递给可调用对象。
总之,std::ref
的作用是将对象的引用转换为可复制的可调用对象,使得在函数或线程等可调用对象中引用原始对象,而不是其副本。
以上就是c++中ref的作用示例解析的详细内容,更多关于c++ ref作用的资料请关注脚本之家其它相关文章!
关键词:
-
世界微速讯:c++中ref的作用示例解析
这篇文章主要为大家介绍了c++中ref的作用示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家
-
日产官方商城 日产官网中国官网
今天来聊聊关于日产官方商城,日产官网中国官网的文章,现在就为大家来简单介绍下日产官方商城,日产官网中
-
广东统计局:一季度广东实现地区生产总值突破3万亿 工业生产增速转正-每日讯息
4月23日,广东统计局发布2023年一季度广东经济运行简况。广东全力推动经济运行整体好转,主要经济指标企稳
-
realtek瑞昱声卡驱动_realtek瑞昱 天天热闻
1、是一般的网卡,家庭上网或者局域网够用的,是由realtek公司生产的百兆网卡。2、支持的连接速度最大为100
-
即时看!Spooky Action宣布他们将在网络周期间购买每台系绳系统免费赠送一台DJIM300
每次购买Superfly2系绳系统,SpookyAction将免费赠送一台DJIM300。SpookyAc
-
每日热门:4月23日星光达珠宝黄金502元/克 铂金360元/克
2023年4月23日,实物黄金星光达珠宝黄金报价502元 克,相比上一个交易日不变。铂金价格今天报价360元 克,
-
英雄气短,儿女情长_关于英雄气短,儿女情长的简介 全球观焦点
1、“英雄气短,儿女情长”,谚语,意思是英雄常受爱恋之情妨碍,男女间情意缠绵悱恻。本文关于英雄气短,
-
“保屯路211弄”高比例生效背后,离不开这群“很拼”的人!|热消息
作为《上海市旧住房成套改造和拆除重建实施管理办法(试行)》发布后,全市首个体量最大的旧住房拆除重建改
-
“五个一百”:激扬网络正能量 聚力奋进新征程
中新网北京4月23日电(宫宏宇)团结奋进新征程,同心奋斗创伟业。由中央网信办主办的2022中国正能量“五个一
-
焦点快报!打造世界秘籍电脑版_打造世界秘籍作弊码
1、打造世界作弊码:在游戏界面按键操作CTRL+F启动作弊CTRL+G得所有物品+10CTRL+R解锁全魔法CTR
-
环球热门:安徽省生命健康产业发展基金首 个投资项目亿芃医疗正式入驻亳州芜湖现代产业园
4月20日清晨,亳芜医疗器械产业园迎来了国内*高端心血管医疗介入器械创新企业的入驻,安徽亿芃医疗科技有限
-
今日看点:巴西学者华一卿:巴中未来合作前景广阔| 世界观
全球化智库(CCG)特邀高级研究员、复旦大学巴西籍学者华一卿(KarinCostaVazquez)近日接受中新网专访时表示,
-
“鄧家莊”柚香土麻饼抽检不合格-环球快消息
“鄧家莊”柚香土麻饼抽检不合格
-
焦点报道:类似九鹭非香小说_类似九鹭非香风格的文
1、按监狱组推荐一个《仗剑一笑踩蘑菇》2、文案:3、从前,有一座田燕山。山上有一个断魂崖,崖旁有一个小
-
感受240Hz高刷的快乐,千元高刷电竞显示器推荐 天天报资讯
大家都知道,显示器的屏幕刷新率越高,在观看视频或者玩游戏的时候,显示效果越流畅,而且还没有掉帧现象的
-
环球微速讯:牛五花肉是牛的哪个部位(牛五花肉是牛的哪个部位图片)
牛五花肉是牛的腹部部位。牛五花肉肥瘦相间,吃起来口感很好。牛五花肉脂肪组织多、肉质细嫩,所以牛五花肉
-
iphone15 pro max将配备新的4800万像素索尼摄像
据报道,即将推出的iphone15promax将配备索尼新的4800万像素定制摄像头,编程客栈传感器尺寸比之前的iphone
-
这条新规,买房的人一定要看 速看料
今天跟大家聊一个法律技术贴,跟买房有关。有买房需求的朋友,一定要关注。最高法院在前天发了一个批复解释
-
【世界聚看点】现在各大银行房贷利率是多少2019_现在各大银行房贷利率
1、目前人行公布贷款基准年利率:0-6个月(含6个月),年利率:4 35%;6个月-1年(含1年),年利率:4 35%;
-
国海证券给予坤恒顺维买入评级-世界观焦点
国海证券04月23日发布研报称,给予坤恒顺维(688283 SH,最新价:61 72元)买入评级。评级理由主要包括:1