std::ref std::cref
1. points
cref 是const ref的意思,常量引用。
先看一个使用例子
上面的例子中,如果没有使用ref,而是下面的形式
std::function<void()> bound_f = std::bind(f, n1, n2, n3);
bind()是一个函数模板,简单来说它可以根据一个已有的函数,生成另一个函数,但是由于bind()不知道生成的函数执行的时候传递的参数是否还有效,所以它选择按值传参而不是按引用传参即使f的定义里使用的是引用形式的入参,f也不会改变n2的值。因为
但是如果f的定义声明里不是引用形式的入参,而是下面的形式,也改变不了n2的值,因为
void f(int& n1, int n2, const int& n3);
ref()是利用模板参数推导实现的,如果你创建一个按值传参的非模板函数而想传递一个引用,ref()是做不到的。
所以有些地方使用需要通过ref来传递引用。如使用bind时,或者thread,详细情况参考下面的网址。
参考:
浅析std::ref与reference_wrapper
http://blog.csdn.net/u014645632/article/details/78966340
为什么C++11引入了std::ref?
https://www.cnblogs.com/jiayayao/p/6527713.html
关于C++ 11中std::ref的用法
http://blog.sina.com.cn/s/blog_7c4f3b160101e8yt.html
cppreference.com
http://zh.cppreference.com/w/cpp/utility/functional/ref
2. 为什么要有std::ref
除了要在上面一些场合使用std::ref来传递引用,std::ref(T) 与T&的还有一些区别:
a) 因为T&一旦创建,便不能修改
b) 不能创建T&数组
而上述两点std::ref(T)都能克服。
参考
C++ Difference between std::ref(T) andT&?
https://stackoverflow.com/questions/33240993/c-difference-between-stdreft-and-t/33243776#33243776?newreg=5672c9cf361c43ec87abd84889b9af0f
std::ref std::cref相关推荐
- 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 看看这段 ...
- C++ std::ref() 函数使用详解
std::ref()是C++标准库中的一个函数,定义在<functional>头文件中,它的作用是将一个对象转换成一个引用包装器(reference wrapper),以便在函数模板中使用 ...
- C++并发编程之std::async(), std::future, std::promise, std::packaged_task
c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的: void f(int n); std::thread t(f, n + 1); t.join(); 但是线程毕竟是属于比 ...
- C++11 并发指南四(future 详解三 std::future std::shared_future)
上一讲<C++11 并发指南四(<future> 详解二 std::packaged_task 介绍)>主要介绍了 <future> 头文件中的 std::pack ...
- C++多线程编程(3) 异步操作类 std::future std::promise std::async
C++中提供了异步操作相关的类: 1. std::future: 异步结果的传输通道,可以很方便的获取线程函数的返回值. 在C++中,如果希望获取线程函数的返回值,就不能直接通过thread.join ...
- C++ 并发指南< future >(3)std::future std::shared_future
std::future介绍 简单地说,std::future 可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段. std::future 通常由某个 Provider 创建,你可 ...
- C++中std::sort/std::stable_sort/std::partial_sort的区别及使用
某些算法会重排容器中元素的顺序,如std::sort.调用sort会重排输入序列中的元素,使之有序,它默认是利用元素类型的<运算符来实现排序的.也可以重载sort的默认排序,即通过sort的第三 ...
- of type std::bad_cast: std::bad_cast
of type std::bad_cast: std::bad_cast 我这里的情况: 我有两个so A 和B,调用程序c B调用a ,b的cmakelist里面要加A和A的头文件: 头文件: in ...
- terminating with uncaught exception of type std::bad_cast: std::bad_cast
terminating with uncaught exception of type std::bad_cast: std::bad_cast 我这里的情况: 我有两个so A 和B,调用程序c 把 ...
最新文章
- 融云任杰:强互动,RTC 下一个“爆点”场景 | 拟合
- Symantec:揭秘Hidden Lynx组织的APT***行动
- 一次布环境,引起的总结
- 聚类之K-means均值聚类
- linux系统适合电脑小白吗,linux小白说说用linux的感受
- wxWidgets:wxRearrangeDialog类用法
- python 字典 get(),items(),iteritems()方法
- Redis 05_List列表 数组 Hash散列
- 骗子公司陆续公布中...
- 技术员联盟Win11 64位官方全新旗舰版镜像V2021.08
- Android View框架总结(五)View布局流程之Layout
- paip.提升用户体验---网站导航栏的设计
- 重载前自增运算符和后自增运算符
- 区块链核心技术演进之路-共识机制演进
- splitcontainer控件固定Panel的大小
- 制作rime配色的fcitx皮肤
- matlab转子瞬态响应,转子热致振动现象的瞬态响应特性研究
- connection_reset解决方案
- STM32中0x1u 0u的含义
- PTP同步中的TAI和UTC时间