c++ std::ref

news2024/11/24 20:40:15

ref

对于函数式编程(如 std::bind),是对参数直接拷贝,而不是引用,std::ref的引入就是为了解决一些传参问题

ref是个函数模板,用来构建一个reference_wrapper对象并返回,该对象拥有传入的elem变量的引用。如果参数本身是一个reference_wrapper类型的对象,则创建该对象的一个副本,并返回。
在这里插入图片描述

使用

#include <iostream>
#include <functional>

void f(int& n1, int& n2, const int& n3)
{
    std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
    ++n1;
    ++n2;
}

int main()
{
    int n1 = 1, n2 = 2, n3 = 3;
    std::function<void()> 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';
}

运行结果:

在这里插入图片描述
std::bind 使用的是参数的拷贝而不是引用,所以在执行 std::bind 后,在函数 f() 中 n1 的值仍然是 1,n2 和 n3 改成了修改的值,因此必须使用 std::ref 来进行引用绑定。

与 std::bind 类似,std::thread 也是必须通过 std::ref 来绑定引用进行传参,否则,形参的引用声明是无效的。

#include <iostream>
#include <thread>

void threadFunc(std::string &str, int a)
{
    str = "change by threadFunc";
    a = 13;
}

int main()
{
    std::string str("hello");
    int a = 1;
    std::thread th(threadFunc, std::ref(str), a);

    th.join();

    std::cout<<"str = " << str << std::endl;
    std::cout<<"a = " << a << std::endl;

    return 0;
}

运行结果:

在这里插入图片描述

ref 和 引用的区别

#include <iostream>
#include <functional>
#include<vector>

using namespace std;

void f(int& a, int& b, int& c)
{
    cout << "in function a = " << a << "  b = " << b << "  c = " << c << endl;
    cout << "in function a = " << &a << "  b = " << &b << "  c = " << &c << endl;
    a += 1;
    b += 10;
    c += 100;
}

int main() {

    int n1 = 1, n2 = 10, n3 = 100;
    int& r1 = n1;
    int& r2 = n2;

    function<void()> f1 = bind(f, r1, r2, ref(n3));		

    f1();
    cout << "out function a = " << n1 << "  b = " << n2 << "  c = " << n3 << endl;
    cout << "out function a = " << &n1 << "  b = " << &n2 << "  c = " << &n3 << endl;
    f1();
    cout << "out function a = " << n1 << "  b = " << n2 << "  c = " << n3 << endl;
    cout << "out function a = " << &n1 << "  b = " << &n2 << "  c = " << &n3 << endl;
    return 0;
}

运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/941692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day-33 代码随想录算法训练营(19) 贪心part03

1005.K次取反后最大化的数组和 思路一&#xff1a;求出正负数的个数&#xff0c;根据k值来进行取反 134.加油站 思路&#xff1a;考虑总油量和当前剩余油量&#xff0c;同时遍历两个数组&#xff0c;当前剩余油量小于0时&#xff0c;说明在 i 之前都无法出发。 135.分发糖果 …

yml基本语法与支持的数据格式

一、yml基本语法 1、yml文件以缩进代表层级关系 2、缩进不允许使用tab只能使用空格 3、空格的个数不重要&#xff0c;只要相同层级的元素左对齐即可 4、大小写敏感 5、数据格式为&#xff0c;名称:(空格)值 二、yml支持的数据格式 1、对象&#xff1a;键值对的集合(key:…

EDAS系统提交 | 编译报错显示 fonttype: Font DejaVuSans is of type Type 3.

目录 1. 问题&#xff1a;fonttype: Font DejaVuSans is of type Type 3. 2. 原因及解决&#xff1a;用python的matplotlib画的图片转出的pdf有问题&#xff0c;包含Type 3字体。 3. 具体解决过程&#xff1a;在用python代码画图时&#xff0c;添加一行代码&#xff0c;重新…

第八周第一天学习总结 | MySQL入门及练习学习第三天

实操练习 1.创建一个名为 lianxi 的数据库 2.在 lianxi 库内创建一个名为 xinxi 的数据表要求如下&#xff1a; 包含信息&#xff1a;编号&#xff0c;姓名&#xff0c;备注&#xff0c;籍贯&#xff0c;部门&#xff0c;公司。 3.给xinxi表添加相应信息&#xff1a; 4.查询…

kafka复习:(22)一个分区只能被消费者组中的一个消费者消费吗?

默认情况下&#xff0c;一个分区只能被消费者组中的一个消费者消费。但可以自定义PartitionAssignor来打破这个限制。 一、自定义PartitionAssignor. package com.cisdi.dsp.modules.metaAnalysis.rest.kafka2023;import org.apache.kafka.clients.consumer.internals.Abstrac…

【环境配置】Android-Studio-OpenCV-JNI以及常见错误 ( 持续更新 )

最近一个项目要编译深度学习的库&#xff0c;需要用到 opencv 和 JNI&#xff0c;本文档用于记录环境配置中遇到的常见错误以及解决方案 Invalid Gradle JDK configuration found failed Invalid Gradle JDK configuration foundInvalid Gradle JDK configuration found. Open…

【Acwing905】区间选点贪心策略超清晰证明!!包含题解

题目描述 贪心策略 首先按右端点对区间进行排序 然后从左到右遍历每一个区间&#xff0c;如果这个区间还没有选中的点&#xff0c;那么就选择这个区间的右端点&#xff0c;否则就pass掉这个区间 举一个栗子 贪心策略证明 假设最少的选点数为&#xff1a;ans 利用上述贪心策…

【JUC基础】JUC入门基础

目录 什么是JUC线程和进程锁传统的 synchronizedLock 锁Synchronized 与 Lock 的区别 生产者和消费者问题Synchronized 版Lock版Condition 的优势&#xff1a;精准通知和唤醒线程 8 锁现象问题1&#xff1a;两个同步方法&#xff0c;先执行发短信还是打电话&#xff1f;问题2&a…

代码随想录刷题笔记 (python版本) 持续更新.....

代码随想录刷题笔记总结: https://www.programmercarl.com/ 个人学习笔记 如有错误欢迎指正交流1. 数组 1.1 理论基础 详细介绍:https://www.programmercarl.com/%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 数组下标都是从0开始的。数组内存空间的地址是…

什么是亚马逊类目核心关键词?

亚马逊类目核心关键词是指在亚马逊平台上&#xff0c;与特定产品类别相关且具有较高搜索量和竞争度的关键词。这些关键词在产品标题、描述、属性和搜索关键字等位置使用&#xff0c;有助于提高产品的曝光度和搜索排名&#xff0c;并吸引潜在买家的注意。选择适当的核心关键词可…

@Configuration 注解的 Full 模式和 Lite 模式!

Configuration 注解相信各位小伙伴经常会用到&#xff0c;但是大家知道吗&#xff0c;这个注解有两种不同的模式&#xff0c;一种叫做 Full 模式&#xff0c;另外一种则叫做 Lite 模式。 准确来说&#xff0c;Full 模式和 Lite 模式其实 Spring 容器在处理 Bean 时的两种不同行…

Nacos基础(2)——nacos的服务器和命名空间 springBoot整合nacos 多个nacos配置的情况

目录 引出nacos服务器和命名空间Nacos服务器命名空间 springBoot整合nacosspringcloud Alibaba 版本与springcloud对应关系引包配置maincontroller 报错以及解决【报错】错误&#xff1a;缺少服务名称报错&#xff1a;9848端口未开放 启动测试引入多个nacos配置多个配置的情况没…

基于java swing和mysql实现的学生选课成绩信息管理系统(源码+数据库+ER图文档+运行指导视频)

一、项目简介 本项目是一套基于java swing和mysql实现的学生选课成绩信息管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。…

概念解析 | 无人机集群形状与轨迹建模: 集群舞蹈的艺术

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:无人机集群形状和轨迹建模 无人机集群形状与轨迹建模: 集群舞蹈的艺术 无人机集群的形状和轨迹建模可能听起来像是一部科幻小说的标题,但它实际上是现实中的一个重要研究领…

国内精选五大现货黄金价格实时查询软件最新名单(综合榜单)

随着金融市场的不断发展和投资者的日益增多&#xff0c;现货黄金价格实时查询软件成为了人们关注的焦点。投资者需要一款功能强大、操作简便、数据准确的软件来帮助他们获取实时的黄金价格信息&#xff0c;以便做出更加明智的投资决策。 本文将介绍国内精选五大现货黄金价格实…

iOS - 订阅型内购指南

一、App Store Connect 帮助 二、测试 三、订阅状态 四、问题思考 1、订阅归属&#xff1a; 以往的消耗性内购, 通常会生成订单ID对应到苹果的内购ID及用户id&#xff0c;对于我们来说&#xff0c;内购仅仅只是个支付工具&#xff0c;而订阅型内购有一整套销售模型订阅内购…

zabbix语言无法选择中文--zabbix安装配置中文

You are not able to choose some of the languages, because locales for them are not installed on the web server. 1、安装wget yum -y install wget 2、下载中文中文字体并配置 wget https://github.com/echohn/zabbix-zh_CN/archive/master.zip yum -y install unzip un…

4年经验来面试20K的测试岗,一问三不知,我还真不如去招应届生...

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是4年工作经验&#xff0c;但面试…

恒运资本:A股三大指数是什么?A股三大指数怎么看?

炒股并不是盲目跟风&#xff0c;投资者自身要了解股票基本常识。例如指数反映的是股票商场上股票的变动状况&#xff0c;能够给我们的投资决策带来一定的依据。那么&#xff0c;A股三大指数是什么&#xff1f;A股三大指数怎么看&#xff1f;恒运资本为我们准备了相关内容&#…

如何给图片加水印?

如何给图片加水印&#xff1f;在我们的日常生活中&#xff0c;许多热爱摄影的朋友都会选择给自己的照片添加水印。这是因为我们深知&#xff0c;一张出色的照片背后需要付出大量的努力和心血&#xff0c;而通过添加水印可以有效地保护自己照片的版权&#xff0c;这样即使将图片…