浅析std::ref

2024-06-23 16:52
文章标签 std 浅析 ref

本文主要是介绍浅析std::ref,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1 为什么需要std::ref

2 std::ref使用示例

2.1 std::thread调用

2.1.1 不使用std::ref,编译失败

2.1.2 使用std::ref修饰输入变量

2.2 stl库调用(以for_each 为例)

2.3 std::bind

2.3.1 使用std::ref

2.3.2 使用placeholders::_x同样可以达到同样效果

3 结论


1 为什么需要std::ref

根据【C++】stdref和stdcref_std::ref和std::cref-CSDN博客

等消息来源的描述,需要std::ref的场景主要是如下三种:

假如std::thread需要调用一个函数,且这个函数的输入参数是引用的话,则std::thread对这个参数的调用必须用ref修饰。

假如sid::bind需要调用一个函数,且这个函数的输入参数是引用的话,则std::bind对这个参数的调用必须用ref修饰。

stl库调用,比如for_each的输入参数里也可以有一个函数指针。假如这个函数的输入参数是一个引用,则函数指针也要用std::ref修饰。

下面通过几个实例来验证以上描述的真伪。代码运行的环境是vs2019

2 std::ref使用示例

2.1 std::thread调用

2.1.1 不使用std::ref,编译失败

// cref.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
#include <thread>
void func(int & a)
{std::cout << "func before modifying a,b,c : a = " << a <<std::endl;a *= 2;
}int main()
{std::cout << "Hello World!\n";int a = 10;std::thread thrd(&func, a);thrd.join();std::cout << "after modifying "<<a;std::cin.get();return 0;
}

2.1.2 使用std::ref修饰输入变量

2.2 stl库调用(以for_each 为例)

可见,只要函数(func)的输入参数是引用,不论用不用std::ref,效果都一样。 

2.3 std::bind

2.3.1 使用std::ref

可见,变量a没有使用ref修饰,所以func函数对其不起作用;变量b,c用ref修饰,所以func函数起改变了它们的取值。 

2.3.2 使用placeholders::_x同样可以达到同样效果

输入变量同样发生变化。 

3 结论

假如std::thread需要调用一个函数,且这个函数的输入参数是引用的话,则std::thread对这个参数的调用必须用ref修饰。

假如sid::bind需要调用一个函数,且这个函数的输入参数是引用的话,则std::bind对这个参数的调用必须用ref修饰。然而,在调用这个函数时,也可以用placeholders::_x来代替该输入参数,效果是一样的。

stl库调用,对for_each做了测试,发现使用和不使用std::ref的效果一样

这篇关于浅析std::ref的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087736

相关文章

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

浅析Java如何保护敏感数据

《浅析Java如何保护敏感数据》在当今数字化时代,数据安全成为了软件开发中至关重要的课题,本文将深入探讨Java安全领域,聚焦于敏感数据保护的策略与实践,感兴趣的小伙伴可以了解下... 目录一、Java 安全的重要性二、敏感数据加密技术(一)对称加密(二)非对称加密三、敏感数据的访问控制(一)基于角色的访问

浅析如何使用xstream实现javaBean与xml互转

《浅析如何使用xstream实现javaBean与xml互转》XStream是一个用于将Java对象与XML之间进行转换的库,它非常简单易用,下面将详细介绍如何使用XStream实现JavaBean与... 目录1. 引入依赖2. 定义 JavaBean3. JavaBean 转 XML4. XML 转 J

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

浅析Python中的绝对导入与相对导入

《浅析Python中的绝对导入与相对导入》这篇文章主要为大家详细介绍了Python中的绝对导入与相对导入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1 Imports快速介绍2 import语句的语法2.1 基本使用2.2 导入声明的样式3 绝对import和相对i

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.